2012-06-28 25 views
17

मैं सरल इंजेक्टर आईओसी कंटेनर के लिए नया हूं। मैं एक परियोजना में काम करना शुरू कर दूंगा जिसके लिए एमवीसी 4 एएसपी.नेट वेब एपीआई का उपयोग कर बहु-किरायेदार एएसपी.नेट एमवीसी कार्यान्वयन की आवश्यकता होगी।क्या सरल इंजेक्टर एमवीसी 4 एएसपी.नेट वेब एपीआई का समर्थन करता है?

मेरा प्रश्न है: क्या सरल इंजेक्टर एमवीसी 4 एएसपी.नेट वेब एपीआई का समर्थन करता है? सरल इंजेक्टर दस्तावेज पढ़ना this एमवीसी 3 के संदर्भ बनाता है और मैं जानना चाहता हूं कि एमवीसी 4 भी समर्थित है या नहीं।

+0

सरल इंजेक्टर 2.5 में एक [वेब एपीआई एकीकरण पैकेज] (https://simpleinjector.codeplex.com/wikipage?title=Web%20API%20 इंटीग्रेशन) शामिल है। – Steven

उत्तर

24

क्या सरल इंजेक्टर आईओसी एमवीसी 4 एएसपी.नेट वेब एपीआई का समर्थन करता है?

वर्तमान में यह एमवीसी 4 वेब एपीआई के लिए कोई समर्थन नहीं है, लेकिन भविष्य में समर्थन जोड़ा जाएगा। ऐसा होने पर The integration guide अपडेट किया जाएगा।


अद्यतन: Web API support सरल इंजेक्टर 2.5 में जोड़ा गया है।


इस दौरान, आप सरल इंजेक्टर के लिए अपने स्वयं के System.Web.Http.Dependencies.IDependencyResolver कार्यान्वयन बना सकते हैं। जब से तुम (जहां एक अनुरोध खत्म हो सकता है एक वेब की मेजबानी पर्यावरण अंदर scoping लागू करने के लिए Per Web Api Request जीवन भर का उपयोग करने की जरूरत है,

public class SimpleInjectorHttpDependencyResolver : 
    System.Web.Http.Dependencies.IDependencyResolver 
{ 
    private readonly Container container; 

    public SimpleInjectorHttpDependencyResolver(
     Container container) 
    { 
     this.container = container; 
    } 

    public System.Web.Http.Dependencies.IDependencyScope 
     BeginScope() 
    { 
     return this; 
    } 

    public object GetService(Type serviceType) 
    { 
     IServiceProvider provider = this.container; 
     return provider.GetService(serviceType); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     IServiceProvider provider = this.container; 
     Type collectionType = typeof(IEnumerable<>).MakeGenericType(serviceType); 
     var services =(IEnumerable<object>)this.ServiceProvider.GetService(collectionType); 
     return services ?? Enumerable.Empty<object>(); 
    } 

    public void Dispose() 
    { 
    } 
} 

इस कार्यान्वयन कोई scoping लागू करता है: नीचे एक आईआईएस की मेजबानी वातावरण में वेब एपीआई के साथ काम करने के लिए कार्यान्वयन है जहां से शुरू हुआ उससे अलग धागे पर)।

Because of the way Web API is designed, सभी वेब एपीआई नियंत्रकों को स्पष्ट रूप से पंजीकृत करना बहुत महत्वपूर्ण है। आप नीचे दिए गए कोड का उपयोग कर ऐसा कर सकते हैं:

var services = GlobalConfiguration.Configuration.Services; 
var controllerTypes = services.GetHttpControllerTypeResolver() 
    .GetControllerTypes(services.GetAssembliesResolver()); 

foreach (var controllerType in controllerTypes) 
{ 
    container.Register(controllerType); 
} 

आप SimpleInjectorHttpDependencyResolver इस प्रकार के रूप में रजिस्टर कर सकते हैं:

// NOTE: Do this as last step, after registering the controllers. 
GlobalConfiguration.Configuration.DependencyResolver = 
    new SimpleInjectorHttpDependencyResolver(container); 
+0

आपकी प्रतिक्रिया के लिए धन्यवाद। – user1489941

+0

मेरे पास एक और सवाल है: सरल इंजेक्टर का उपयोग कर प्रतिबिंब से बचा जा सकता है? – user1489941

+0

क्यू में कोड सुधार: 'GetAllInstance' को 'GetAllInstances' में सही किया गया। अनजाने में, SO को संपादन करने के लिए 6+ वर्णों की आवश्यकता होती है, लेकिन किसी को उन्हें यह बताने चाहिए कि * कोड * के लिए, कंप्यूटर क्षमा नहीं कर रहे हैं, ऐसे टाइपो को पकड़ा जाना चाहिए और संपादित किया जाना चाहिए। –

3

संक्षिप्त उत्तर है: हाँ, यह काम करता है।

var container = new Container(); 

//Register you types in container here 

container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); 
container.RegisterMvcAttributeFilterProvider(); 

var controllerTypes = 
from type in Assembly.GetExecutingAssembly().GetExportedTypes() 
where typeof(ApiController).IsAssignableFrom(type) 
where !type.IsAbstract 
where !type.IsGenericTypeDefinition 
where type.Name.EndsWith("Controller", StringComparison.Ordinal) 
select type; 

foreach (var controllerType in controllerTypes) 
{ 
    container.Register(controllerType); 
} 

container.Verify(); 
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); 

आप निम्नलिखित कोड का टुकड़ा इस्तेमाल कर सकते हैं एपीआई नियंत्रकों में अपने प्रकार के पहुंचने के लिए:: नीचे कोड स्निपेट है कि दोनों वेब एपीआई और MVC4 नियंत्रकों (आंशिक रूप से ऊपर स्टीवन की प्रतिक्रिया के आधार पर) के साथ अपने प्रोजेक्ट के लिए काम करता है

DependencyResolver.Current.GetService<InterfaceName>()