是否有任何HttpControllerBuilder为的ASP.NET Web API? [英] Is there any HttpControllerBuilder for ASP.NET Web API?

查看:261
本文介绍了是否有任何HttpControllerBuilder为的ASP.NET Web API?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我想要实现的ASP.NET MVC控制器依赖注入,我可以使用 IControllerFactory 界面来创建一个工厂类,然后在Global.asax中注册。 CS,如:

  ControllerBuilder.Current.SetControllerFactory(的ControllerFactory)

(参考: http://www.dotnetcurry.com/ShowArticle.aspx?ID = 786

现在我的问题是:

我怎么能设置一个工厂的 IHttpControllerActivator 派生类?

我们有东西在ASP.NET MVC 4.0,如:

  HttpControllerBuilder.Current.SetApiControllerActivator(httpControllerActivator)


更新:

我想加我目前的code,它可能有助于了解的情况:

我的定制HttpControllerActivator:

 公共类MyCustomApiActivator:DefaultHttpControllerActivator
                                    //或IHttpControllerActivator?
{
    私人只读字典<字符串函数功能:LT; Htt的prequestMessage,IHttpController>> _apiMap;    公共MyCustomApiActivator(IMyRepository库)
    {
        如果(库== NULL)
        {
            抛出新的ArgumentException(库);
        }
        _apiMap =新词典<字符串函数功能:LT; Htt的prequestMessage,IHttpController>>();
        controllerMap [家] =背景=>新的HomeController();
        _apiMap [MyCustomApi] =背景=>新MyCustomApiController(资料库);
    }    公共IHttpController创建(HTT prequestMessage要求,HttpControllerDescriptor controllerDescriptor,类型controllerType)
    {
        如果(_apiMap.ContainsKey(controllerType.Name))
            返回_apiMap [controllerType.Name](要求);
        返回null;
    }
}

我的作文根:

 公共类CompositionRoot
{
    私人只读IHttpControllerActivator _apiControllerActivator;    公共CompositionRoot()
    {
        _apiControllerActivator = CompositionRoot.CreateHttpControllerActivator();
    }    公共IHttpControllerActivator ApiControllerActivator
    {
        {返回_apiControllerActivator; }
    }    私有静态IHttpControllerActivator CreateHttpControllerActivator()
    {
        字符串defaultRepositoryTypeName = ConfigurationManager.AppSettings [DefaultRepositoryTypeName];
        VAR defaultRepositoryType = Type.GetType(defaultRepositoryTypeName,真);
        VAR defaultRepository =(IMyRepository)Activator.CreateInstance(defaultRepositoryType);        VAR apiController =新MyCustomApiActivator(defaultRepository);
        返回apiController;
    }
}

最后这里面我的Global.asax.cs ,我需要一招:

 保护无效的Application_Start()
    {
        AreaRegistration.RegisterAllAreas();        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        VAR根=新CompositionRoot();
        //下面一行提出这个编译时错误:
        //无法从System.Web.Http.Dispatcher.IHttpControllerActivator'转换
        //为'System.Web.Mvc.IControllerFactory
        ControllerBuilder.Current.SetControllerFactory(root.ApiControllerActivator);
    }


解决方案

标记西曼,在.NET依赖注入的作者,对DI短一系列ASP.NET的WebAPI。

他把内部的构成根 IHttpControllerActivator


  1. Dependency注入和寿命与管理的ASP.NET Web API

  2. Dependency注射在温莎城堡
  3. 的ASP.NET Web API

也许有帮助。


更新

GlobalConfiguration.Configuration.Services.Replace(
  typeof运算(IHttpControllerActivator)
  新PoorMansCompositionRoot())

注册您的自定义 HttpControllerActivator 全球

If I want to implement a Dependency Injection for ASP.NET MVC controllers, I can use IControllerFactory interface to create a factory class and then register it in Global.asax.cs, like:

ControllerBuilder.Current.SetControllerFactory(controllerFactory)

(reference: http://www.dotnetcurry.com/ShowArticle.aspx?ID=786)

Now my question is:

How could I set a factory for an IHttpControllerActivator derived class?

Do we have something in ASP.NET MVC 4.0 like:

HttpControllerBuilder.Current.SetApiControllerActivator(httpControllerActivator)

?


Update:

I want to add my current code, it might be helpful to understand the case:

My customized HttpControllerActivator:

public class MyCustomApiActivator : DefaultHttpControllerActivator 
                                    //or IHttpControllerActivator ?
{
    private readonly Dictionary<string, Func<HttpRequestMessage, IHttpController>> _apiMap;

    public MyCustomApiActivator(IMyRepository repository)
    {
        if (repository == null)
        {
            throw new ArgumentException("repository");
        }
        _apiMap = new Dictionary<string, Func<HttpRequestMessage, IHttpController>>();
        controllerMap["Home"] = context => new HomeController();
        _apiMap["MyCustomApi"] = context => new MyCustomApiController(repository);
    }

    public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
    {
        if(_apiMap.ContainsKey(controllerType.Name))
            return _apiMap[controllerType.Name](request);
        return null;
    }
}

My composition root:

public class CompositionRoot
{
    private readonly IHttpControllerActivator _apiControllerActivator;

    public CompositionRoot()
    {
        _apiControllerActivator = CompositionRoot.CreateHttpControllerActivator();
    }

    public IHttpControllerActivator ApiControllerActivator
    {
        get { return _apiControllerActivator; }
    }

    private static IHttpControllerActivator CreateHttpControllerActivator()
    {
        string defaultRepositoryTypeName = ConfigurationManager.AppSettings["DefaultRepositoryTypeName"];
        var defaultRepositoryType = Type.GetType(defaultRepositoryTypeName, true);
        var defaultRepository = (IMyRepository)Activator.CreateInstance(defaultRepositoryType);

        var apiController = new MyCustomApiActivator(defaultRepository);
        return apiController;
    }
}

Finally this is inside my Global.asax.cs, where I need a trick:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);


        var root = new CompositionRoot();
        //The following line raise this compile-time error:
        // cannot convert from 'System.Web.Http.Dispatcher.IHttpControllerActivator' 
        //                to 'System.Web.Mvc.IControllerFactory'
        ControllerBuilder.Current.SetControllerFactory(root.ApiControllerActivator);
    }

解决方案

Mark Seemann, author of Dependency Injection in .NET, has a short series on DI with ASP.NET WebAPI.

He places the composition root inside an IHttpControllerActivator

  1. Dependency Injection and Lifetime Management with ASP.NET Web API
  2. Dependency Injection in ASP.NET Web API with Castle Windsor

Maybe that helps.


Update

GlobalConfiguration.Configuration.Services.Replace(
  typeof(IHttpControllerActivator),
  new PoorMansCompositionRoot());

Registers your custom HttpControllerActivator globally.

这篇关于是否有任何HttpControllerBuilder为的ASP.NET Web API?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆