चार ऐसा करने का वेरिएंट autofac documentation में वर्णित हैं:
विकल्प 1: को पुनः डिजाइन आपका इंटरफेस
जब आप एक स्थिति है जहाँ आप कि समान सेवाओं को लागू घटकों का एक समूह है में चलाने लेकिन उन्हें समान रूप से इलाज नहीं किया जा सकता है, यह आम तौर पर एक इंटरफ़ेस डिज़ाइन समस्या है।
किसी ऑब्जेक्ट उन्मुख विकास परिप्रेक्ष्य से, आप अपने ऑब्जेक्ट्स को लिस्कोव प्रतिस्थापन सिद्धांत का पालन करने और ब्रेक के पालन के लिए चाहते हैं।
कुछ इंटरफ़ेस रीडिज़ाइन करके, आपको " संदर्भ द्वारा निर्भरता" चुनने की आवश्यकता नहीं है - आप अलग-अलग प्रकारों का उपयोग करते हैं और ऑटो-वायरअप जादू को संकल्प के दौरान होने देते हैं।
यदि आपके पास अपने समाधान पर परिवर्तन को प्रभावित करने की क्षमता है, तो यह अनुशंसित विकल्प है।
विकल्प 2: पंजीकरण बदलें
आप मैन्युअल रूप से है कि रास्ते में लेने वाली घटक के साथ उचित प्रकार संबद्ध कर सकते हैं:
var builder = new ContainerBuilder();
builder.Register(ctx => new ShippingProcessor(new PostalServiceSender()));
builder.Register(ctx => new CustomerNotifier(new EmailNotifier()));
var container = builder.Build();
// Lambda registrations resolve based on the specific type, not the
// ISender interface.
builder.Register(ctx => new ShippingProcessor(ctx.Resolve<PostalServiceSender>()));
builder.Register(ctx => new CustomerNotifier(ctx.Resolve<EmailNotifier>()));
var container = builder.Build();
विकल्प 3: उपयोग बंद सेवाएं
builder.RegisterType<PostalServiceSender>()
.As<ISender>()
.Keyed<ISender>("order");
builder.RegisterType<EmailNotifier>()
.As<ISender>()
.Keyed<ISender>("notification");
builder.RegisterType<ShippingProcessor>()
.WithParameter(
new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(ISender),
(pi, ctx) => ctx.ResolveKeyed<ISender>("order")));
builder.RegisterType<CustomerNotifier>();
.WithParameter(
new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(ISender),
(pi, ctx) => ctx.ResolveKeyed<ISender>("notification")));
विकल्प 4: मेटाडाटा
builder.RegisterType<PostalServiceSender>()
.As<ISender>()
.WithMetadata("SendAllowed", "order");
builder.RegisterType<EmailNotifier>()
.As<ISender>()
.WithMetadata("SendAllowed", "notification");
builder.RegisterType<ShippingProcessor>()
.WithParameter(
new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(ISender),
(pi, ctx) => ctx.Resolve<IEnumerable<Meta<ISender>>>()
.First(a => a.Metadata["SendAllowed"].Equals("order"))));
builder.RegisterType<CustomerNotifier>();
.WithParameter(
new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(ISender),
(pi, ctx) => ctx.Resolve<IEnumerable<Meta<ISender>>>()
.First(a => a.Metadata["SendAllowed"].Equals("notification"))));
उत्तर के लिए धन्यवाद। यह बढ़िया काम करता है। लेकिन मेरे कुछ Impl1 और SomeImpl2 की कई अन्य सेवाओं पर निर्भरता है। मैं पंजीकरण के दौरान उन सभी को निर्दिष्ट नहीं करना चाहता हूं। पंजीकरण के दौरान एक उदाहरण बनाये बिना इसे हासिल करने का कोई तरीका है: नया कुछ Impl1()? –
मेरा मतलब कुछ है: builder.RegisterType()। ()। ([सेवा 1 के पहले पैरामीटर के लिए यहां "impl1" निर्दिष्ट कैसे करें?]); –
मैंने जवाब अपडेट किया है कि 'रजिस्टर टाइप' के साथ इसे कैसे प्राप्त किया जाए। – bentayloruk