是否有任何HttpControllerBuilder为的ASP.NET Web API? [英] Is there any HttpControllerBuilder for 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
- Dependency注入和寿命与管理的ASP.NET Web API
- Dependency注射在温莎城堡 的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
- Dependency Injection and Lifetime Management with ASP.NET Web API
- 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屋!