, ben gibi, bir fabrika sınıfı oluşturmak ve sonra Global.asax.cs içinde kaydettikten IControllerFactory
arabirimini kullanabilirsiniz: http://www.dotnetcurry.com/ShowArticle.aspx?ID=786)ASP.NET Web API için HttpControllerBuilder var mı?</p> <pre><code>ControllerBuilder.Current.SetControllerFactory(controllerFactory) </code></pre> <p>(referans: ASP.NET MVC denetleyicileri için bir Bağımlılık enjeksiyon uygulamak istiyorsanız
Şimdi sorum şu:
Nasıl bir IHttpControllerActivator
türetilmiş bir sınıf için bir fabrika set olabilir?
HttpControllerBuilder.Current.SetApiControllerActivator(httpControllerActivator)
:
biz gibi ASP.NET MVC 4.0 bir şey var mı?
Güncelleme: benim şimdiki kodu eklemek istediğiniz
, durumda anlamak için yararlı olabilir:
Benim özelleştirilmiş 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 kompozisyon kök:
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;
}
}
Nihayet bu bir hile gerek benim Global.asax.cs
, içeride:
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);
}
"Create" yöntemi hangi nedenle ateş etmiyor? Ben genel bir denetleyicisi dönmek 'kamu IHttpController oluştur ( HttpRequestMessage isteği HttpControllerDescriptor controllerDescriptor, Tip _controllerType) {return (IHttpController) yeni GenericApiController(); } ' –
Bellash