是否有适用于ASP.NET Web API的HttpControllerBuilder?

Toh*_*hid 13 dependency-injection asp.net-mvc-4 asp.net-web-api

如果我想为ASP.NET MVC控制器实现依赖注入,我可以使用IControllerFactoryinterface创建工厂类,然后在Global.asax.cs中注册它,如:

ControllerBuilder.Current.SetControllerFactory(controllerFactory)
Run Code Online (Sandbox Code Playgroud)

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

现在我的问题是:

我怎样才能为IHttpControllerActivator派生类设置工厂?

我们在ASP.NET MVC 4.0中有什么东西:

HttpControllerBuilder.Current.SetApiControllerActivator(httpControllerActivator)
Run Code Online (Sandbox Code Playgroud)


更新:

我想添加我当前的代码,理解这个案例可能会有所帮助:

我定制的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的作文根:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后这是我的内心Global.asax.cs,我需要一个技巧:

    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);
    }
Run Code Online (Sandbox Code Playgroud)

Seb*_*ber 9

Mark Seemann,.NET中的Dependency Injection的作者,与ASP.NET WebAPI有关DI的简短系列.

他把作品根放在了里面 IHttpControllerActivator

  1. 使用ASP.NET Web API进行依赖注入和生命周期管理
  2. 使用Castle Windsor的ASP.NET Web API中的依赖注入

也许这有帮助.


更新

GlobalConfiguration.Configuration.Services.Replace(
  typeof(IHttpControllerActivator),
  new PoorMansCompositionRoot());
Run Code Online (Sandbox Code Playgroud)

HttpControllerActivator全局注册您的自定义.