कंटेनर के निर्माण के बाद सेवाओं को जोड़ना


87

क्या रन-टाइम पर एक सेवा को पंजीकृत करना संभव है, जिसका ContainerBuilderनिर्माण होने के बाद अर्थ बनाया गया है और बनाया Containerगया है (और ContainerBuilderनिपटान किया गया है)?


वर्तमान में, सर्वोत्तम प्रथाओं का कहना है कि ऑटोफ़ेक कंटेनर अपरिवर्तनीय हैं
Ady

जवाबों:


96

हां, आप इस Updateपद्धति का उपयोग कर सकते हैं ContainerBuilder:

var newBuilder = new ContainerBuilder();
newBuilder.Register...;

newBuilder.Update(existingContainer);

2
ध्यान दें कि मौजूदा कंटेनर को अद्यतन करने के लिए जो पहले से ही उपयोग में लाया गया है, इसका परिणाम अनिर्दिष्ट व्यवहार हो सकता है। उदाहरण के लिए, उन घटकों को प्रतिस्थापित करना जो पहले से ही हल किए गए एकल की निर्भरता हैं मूल घटक को संदर्भित रहने का कारण बनता है।
स्टीवन


19

चूंकि कंटेनरबुर्टल.उपडेट को पदावनत कर दिया गया है, इसलिए नई सिफारिश बाल जीवनकाल के दायरे का उपयोग करने के लिए है।

एक लाइफटाइम स्कोप में पंजीकरण जोड़ना

जैसे ही आप आजीवन स्कोप बनाते हैं ऑटोफैक आपको "फ्लाई पर" पंजीकरण जोड़ने की अनुमति देता है। जब आपको "स्पॉट वेल्ड" सीमित पंजीकरण ओवरराइड करने की आवश्यकता होती है या अगर आपको आम तौर पर बस कुछ अतिरिक्त सामान की आवश्यकता होती है तो आप इसमें मदद कर सकते हैं। आप एक लैम्बडा को BeginLifetimeScope () में पारित करके ऐसा करते हैं जो एक कंटेनरबर्स्ट लेता है और पंजीकरण जोड़ता है।

using(var scope = container.BeginLifetimeScope(
  builder =>
  {
    builder.RegisterType<Override>().As<IService>();
    builder.RegisterModule<MyModule>();
  }))
{
  // The additional registrations will be available
  // only in this lifetime scope.
}

लाइफटाइम स्कोप्स के साथ काम करना


ध्यान देने वाली बात यह है कि प्रयोग ब्लॉक में टिप्पणी करें। "अतिरिक्त पंजीकरण केवल इस जीवनकाल के दायरे में उपलब्ध होंगे।"
Ady
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.