आपके उपयोग के मामले वर्णन देखते हुए, मैं कहेंगे आप विकल्पों में से कुछ है।
पहला, आप केवल प्रत्येक एप्लिकेशन को निर्भरता के अपने सेट दर्ज कर सकते हैं जिसमें जीवनकाल के दायरे शामिल हैं। इस संबंध में कोड के एक या दो "डुप्लिकेट" टुकड़े होने के कारण आवेदन के बीच मतभेदों और तथ्य यह है कि पंजीकरण काफी छोटे दिखाई देते हैं।
दूसरा, आप एक कंटेनरबिल्डर एक्सटेंशन विधि में सामान्य भाग (शून्य जीवनकाल स्कोप) को लपेट सकते हैं जिसका उपयोग प्रत्येक एप्लिकेशन में किया जा सकता है। इसका अभी भी मतलब होगा कि प्रत्येक ऐप में थोड़ा "डुप्लिकेट कोड" होता है लेकिन सामान्य तर्क एक साधारण एक्सटेंशन में लपेटा जाएगा।
public static IRegistrationBuilder<TLimit, ScanningActivatorData, DynamicRegistrationStyle>
RegisterConnection<TLimit, ScanningActivatorData, DynamicRegistrationStyle>(this ContainerBuilder builder)
{
// Put the common logic here:
builder.Register(...).AsImplementedInterfaces();
}
प्रत्येक अनुप्रयोग में इस तरह के एक विस्तार उपभोक्ता दिखाई देगा: अंत में
builder.RegisterConnection().InstancePerHttpRequest();
// or
builder.RegisterConnection().InstancePerLifetimeScope();
, यदि आप जानते हैं कि यह या तो वेब या गैर वेब है, अगर आप वह स्विच संभालती कस्टम मॉड्यूल बना सकता है :
+०१२३५१६४१०६१:
public class ConnectionModule : Autofac.Module
{
bool _isWeb;
public ConnectionModule(bool isWeb)
{
this._isWeb = isWeb;
}
protected override void Load(ContainerBuilder builder)
{
var reg = builder.Register(...).AsImplementedInterfaces();
if(this._isWeb)
{
reg.InstancePerHttpRequest();
}
else
{
reg.InstancePerLifetimeScope();
}
}
}
प्रत्येक आवेदन में, आप तो मॉड्यूल रजिस्टर कर सकता है
// Web application:
builder.RegisterModule(new ConnectionModule(true));
// Non-web application:
builder.RegisterModule(new ConnectionModule(false));
वैकल्पिक रूप से, आपने अपने अन्य ऐप्स में अपने जीवनकाल के दायरे का उल्लेख किया है।आप बना सकते हैं अपने मॉड्यूल का नाम ले:
public class ConnectionModule : Autofac.Module
{
object _scopeTag;
public ConnectionModule(object scopeTag)
{
this._scopeTag = scopeTag;
}
protected override void Load(ContainerBuilder builder)
{
var reg = builder.Register(...)
.AsImplementedInterfaces()
.InstancePerMatchingLifetimeScope(this._scopeTag);
}
}
खपत समान है:
// Web application (using the standard tag normally provided):
builder.RegisterModule(new ConnectionModule("httpRequest"));
// Non-web application (using your custom scope name):
builder.RegisterModule(new ConnectionModule("yourOtherScopeName"));
मैं बस एक वेब अनुप्रयोग में InstancePerLifetimeScope
का उपयोग कर जब तक कि वास्तव में आप क्या चाहते हैं के खिलाफ की सिफारिश करेंगे। जैसा कि अन्य उत्तरों/टिप्पणियों में उल्लेख किया गया है, InstancePerHttpRequest
एक विशिष्ट नामित जीवनकाल क्षेत्र का उपयोग करता है ताकि बच्चे के जीवनकाल के क्षेत्र को सुरक्षित रखना सुरक्षित हो; InstancePerLifetimeScope
का उपयोग इस तरह के प्रतिबंध नहीं है इसलिए आपको अनुरोध के लिए एक कनेक्शन के बजाय वास्तव में एक बच्चे के दायरे में एक कनेक्शन प्राप्त होगा। मैं, व्यक्तिगत रूप से, यह नहीं मानता कि अन्य डेवलपर बाल जीवनकाल के क्षेत्र (which is a recommended practice) का उपयोग नहीं करेंगे, इसलिए मेरे अनुप्रयोगों में मैं बहुत विशिष्ट हूं। यदि आप अपने आवेदन के कुल नियंत्रण में हैं और आप आश्वस्त कर सकते हैं कि आप अतिरिक्त बाल स्कॉप्स नहीं बना रहे हैं या आप वास्तव में प्रति कनेक्शन एक कनेक्शन चाहते हैं, तो शायद InstancePerLifetimeScope
आपकी समस्या का समाधान करेगा।
क्या आपके पास कनेक्शन के लिए दिमाग में विशिष्ट जीवनकाल है? यदि हां, तो क्या वे प्रति आवेदन अलग-अलग जीवनकाल हैं या क्या यह हमेशा आवेदन प्रकार के बावजूद समान है? पूलिंग के बारे में क्या? क्या आप कुछ ऐप्स में पूल करते हैं लेकिन दूसरों को नहीं? –
ऐसा लगता है जैसे "एमवीसी एक्सटेंशन एक बार-प्रति-अनुरोध तंत्र प्राप्त करने के लिए एक नामित क्षेत्र का उपयोग करते हैं।" जब आप कंसोल ऐप में मॉड्यूल का उपयोग करते हैं तो एचटीपी नाम का दायरा वहां नहीं होता है। वर्तमान में मैं देख रहा हूं कि काम की इकाई क्या होगी और यह एक दायरे में encapsulated जाएगा। –