ASP.NET कोर, चीजें आप is bind "open generics" (सामान्य प्रकार एक ठोस प्रकार के अबाध) माइक्रोसॉफ्ट के निर्भरता इंजेक्शन ढांचे के साथ क्या कर सकते हैं में से एक तो जैसे में:फैक्टरी पैटर्न
public void ConfigureServices(IServiceCollection services) {
services.AddSingleton(typeof(IRepository<>), typeof(Repository<>))
}
तुम भी उपयोग कर सकते हैं the factory pattern to hydrate dependencies। यहाँ एक काल्पनिक उदाहरण है:
public interface IFactory<out T> {
T Provide();
}
public void ConfigureServices(IServiceCollection services) {
services.AddTransient(typeof(IFactory<>), typeof(Factory<>));
services.AddSingleton(
typeof(IRepository<Foo>),
p => p.GetRequiredService<IFactory<IRepository<Foo>>().Provide()
);
}
हालांकि, मैं कैसे एक साथ दो अवधारणाओं गठबंधन करने के लिए यह पता लगाने के लिए सक्षम नहीं किया गया। ऐसा लगता है जैसे यह इस तरह से शुरू होगा, लेकिन मुझे ठोस प्रकार की आवश्यकता है जिसका प्रयोग IRepository<>
के उदाहरण को हाइड्रेट करने के लिए किया जा रहा है।
public void ConfigureServices(IServiceCollection services) {
services.AddTransient(typeof(IFactory<>), typeof(Factory<>));
services.AddSingleton(
typeof(IRepository<>),
provider => {
// Say the IServiceProvider is trying to hydrate
// IRepository<Foo> when this lambda is invoked.
// In that case, I need access to a System.Type
// object which is IRepository<Foo>.
// i.e.: repositoryType = typeof(IRepository<Foo>);
// If I had that, I could snag the generic argument
// from IRepository<Foo> and hydrate the factory, like so:
var modelType = repositoryType.GetGenericArguments()[0];
var factoryType = typeof(IFactory<IRepository<>>).MakeGenericType(modelType);
var factory = (IFactory<object>)p.GetRequiredService(factoryType);
return factory.Provide();
}
);
}
अगर मैं एक खुली जेनेरिक साथ Func<IServiceProvider, object>
functor इस्तेमाल करने की कोशिश, मैं संदेश Open generic service type 'IRepository<T>' requires registering an open generic implementation type.
डॉटनैट CLI से साथ this ArgumentException
मिलता है। यह लैम्ब्डा तक भी नहीं पहुंचता है।
क्या माइक्रोसॉफ्ट के निर्भरता इंजेक्शन ढांचे के साथ इस प्रकार का बाध्यकारी संभव है?
क्या registerin का लाभ है जी एक लैम्ब्डा जो एक कारखाने को हल करता है जो आवश्यक सेवा को हल करता है? – Steven
अच्छा सवाल। यह सशर्त हाइड्रेशन के लिए जटिलता reroutes। लैम्ब्डा एक के रूप में कार्य करता है, इसलिए आपको एक स्पष्ट फैक्ट्री की आवश्यकता नहीं है (इसके चर को "कार्यान्वयन फैक्ट्री" भी कहा जाता है), लेकिन यदि आपको हाइड्रेट करना चाहते हैं तो इस पर निर्णय लेने के लिए आपको कई सेवाओं की आवश्यकता है, तो आपके पास एक लैम्ब्डा जो जटिल और परीक्षण करने में मुश्किल है। ऊपर दिए गए ब्लॉग पोस्ट में एक अच्छा उदाहरण है: http://dotnetliberty.com/index.php/2016/05/09/asp-net-core-factory-pattern- निर्भरता- इंजेक्शन/ – Technetium
क्या आपको कभी अच्छा लगता है इसके लिए जवाब? मेरे पास एक ही समस्या है, लेकिन यहां कोई भी जवाब समस्या के लिए एक अच्छा समाधान प्रतीत नहीं होता है –