मैं ASP.NET MVC नियंत्रकों के लिए एक निर्भरता इंजेक्शन लागू करना चाहते हैं, मैं की तरह एक कारखाने वर्ग बनाने और उसके बाद Global.asax.cs में यह रजिस्टर करने के लिए, IControllerFactory
इंटरफ़ेस का उपयोग कर सकते हैं: http://www.dotnetcurry.com/ShowArticle.aspx?ID=786)क्या एएसपी.नेट वेब एपीआई के लिए कोई एचटीपी कंट्रोलरबिल्डर है?</p> <pre><code>ControllerBuilder.Current.SetControllerFactory(controllerFactory) </code></pre> <p>(संदर्भ:
अब मेरी सवाल यह है:
मैं एक IHttpControllerActivator
व्युत्पन्न वर्ग के लिए एक कारखाने सेट कर सकते हैं?
HttpControllerBuilder.Current.SetApiControllerActivator(httpControllerActivator)
:
हम ASP.NET MVC 4.0 की तरह में कुछ है?
अद्यतन:
मैं अपने वर्तमान कोड जोड़ना चाहते हैं, यह मामला समझने के लिए उपयोगी हो सकता है:
मेरा अनुकूलित 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;
}
}
मेरे रचना रूट:
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;
}
}
अंत में यह मेरा 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);
}
किस कारण से 'बनाएं' विधि आग नहीं है? मैं एक सामान्य नियंत्रक वापसी 'सार्वजनिक IHttpController बनाएँ ( HttpRequestMessage अनुरोध, HttpControllerDescriptor controllerDescriptor, प्रकार _controllerType) {वापसी (IHttpController) नई GenericApiController(); } ' –
Bellash