2012-10-22 10 views
11

मैं 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); 
    } 

उत्तर

8

मार्क सीनैन, .NET में निर्भरता इंजेक्शन के लेखक, ASP.NET वेबएपीआई साथ डि पर एक छोटी श्रृंखला है।

वह एक IHttpControllerActivator

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

हो सकता है कि मदद करता है अंदर रचना जड़ देता है।


अद्यतन

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

रजिस्टर अपने कस्टम HttpControllerActivator विश्व स्तर पर।

+0

किस कारण से 'बनाएं' विधि आग नहीं है? मैं एक सामान्य नियंत्रक वापसी 'सार्वजनिक IHttpController बनाएँ ( HttpRequestMessage अनुरोध, HttpControllerDescriptor controllerDescriptor, प्रकार _controllerType) {वापसी (IHttpController) नई GenericApiController (); } ' – Bellash

1

ASP.NET वेब API में HttpControllerDispatcher नियंत्रकों के निर्माण के लिए जिम्मेदार है। यह डिफ़ॉल्ट रूप से DependecyResolver के साथ काम करता है लेकिन यदि आप इसकी कार्यक्षमता को विस्तारित करना चाहते हैं, तो आपको इसकी SendAsync विधि को ओवरराइड करने और इसे फिर से पंजीकृत करने की आवश्यकता है।

उदाहरण:

public class MyCustomDispatcher : HttpControllerDispatcher { 

    protected override Task<HttpResponseMessage> SendAsync(
     HttpRequestMessage request, 
     CancellationToken cancellationToken) { 

     // Do your stuff here 

     // According to your requirements, either run its default functionality 
     // or return your own stuff 
     return base.SendAsync(request, cancellationToken); 
    } 
} 

नोट:

हालांकि, मैं एक विश्व स्तर पर डिफ़ॉल्ट को बदलने के लिए एक सुंदर रास्ता खोजने के लिए सक्षम नहीं था। आप द्वारा रूट पर इस कस्टम प्रेषक को आसानी से अटैचमेंट प्रति डिफ़ॉल्ट रूप से प्रतिस्थापित कर सकते हैं लेकिन ऐसा लगता है कि यह वैश्विक स्तर पर ऐसा करने के लिए तरीका नहीं है। मैं परियोजना स्थल पर उस पर एक चर्चा खोल दिया: http://aspnetwebstack.codeplex.com/discussions/400366