2012-09-03 17 views
8

के साथ कन्स्ट्रक्टर स्ट्रिंग तर्कों का कन्वेंशन आधारित बाध्यकारी मैं अपने प्रोजेक्ट में आईओसी कंटेनर के रूप में निनजेक्ट का उपयोग कर रहा हूं। मेरे पास निम्न वर्ग है:निनजा

public class SomeRepository:ISomeRepository 
{ 
    public SomeRepository(string someDatabaseConnectionString) 
    { 
     // some code here.. 
    } 
} 

मेरी एप्लिकेशन सेटिंग्स फ़ाइल में मेरे पास "someDatabase" नामक कनेक्शन स्ट्रिंग है। डिफ़ॉल्ट रूप से एक आदेश निर्माता में इस कनेक्शन स्ट्रिंग इंजेक्षन करने के लिए निम्न विन्यास जोड़ना चाहिए:

kernel.Bind<ISomeRepository>() 
    .To<SomeRepository>() 
    .WithConstructorArgument("someDatabaseConnectionString", connString); 

लेकिन मैं लागू करने के लिए इस तरह के तार के पारंपरिक बंधन आधारित चाहते हैं। स्ट्रिंग प्रकार के सभी कन्स्ट्रक्टर पैरामीटर के लिए मान जिन्हें "कनेक्शनस्ट्रिंग" के साथ समाप्त होता है, एप्लिकेशन के कनेक्शन से लिया जाना चाहिए स्ट्रिंग कॉन्फ़िगरेशन अनुभाग और स्वचालित रूप से इंजेक्शन दिया जाना चाहिए। मैं एपसेटिंग अनुभाग के लिए भी इसी तरह के सम्मेलन को लागू करना चाहता हूं। यह दृष्टिकोण मार्क सीमन के "Primitive Dependencies" आलेख ("प्राइमेटिव्स के लिए सम्मेलन" अनुभाग) में अधिक जानकारी में वर्णित है। कैसल विंडसर कंटेनर उदाहरणों में इस्तेमाल किया गया था।

क्या निनजेक्ट का उपयोग करके इस तरह के सम्मेलनों को लागू करना संभव है और ऐसा करने का सबसे अच्छा तरीका क्या है? मैंने पहले से ही ninject.extensions.conventions की कोशिश की है लेकिन लगता है कि इसमें ऐसी कार्यक्षमता नहीं है, है ना?

+0

क्या आप ConfigManager.AppSettings ["someDatabaseConnectionString"] का उपयोग कर सकते हैं? – Ben

+0

वर्तमान में मैं ConfigurationManager.AppSettings ["someDatabaseConnectionString"] का उपयोग कर रहा हूं। लेकिन कल्पना करें कि आपके पास 20 या अधिक कक्षाएं हैं जो कनेक्शन स्ट्रिंग से निर्भर हैं। मैं इन वर्गों में से प्रत्येक के लिए विशिष्ट नियम नहीं लिखना चाहता हूं, मैं निर्भरता को स्वचालित रूप से इंजेक्ट करना चाहता हूं। –

उत्तर

1

ऐसा लगता है कि इस तरह के सम्मेलन-आधारित बाइंडिंग अभी निनजेक्ट के साथ संभव नहीं है। I had a similar question here और सुझाव कनेक्शन स्ट्रिंग को वापस करने के लिए एक इंटरफ़ेस बनाना था और पैरामीटर के रूप में रखना था। यद्यपि यह कई अलग-अलग कनेक्शन तारों के लिए कठिन हो सकता है।

यह सिर्फ एक विचार है, लेकिन क्या आपके पास IConnectionStringProvider<T> हो सकता है जो टी का नाम पाने के लिए प्रतिबिंब का उपयोग कर सकता है और इस तरह से एप्लिकेशन सेटिंग को देख सकता है? हो सकता है कि इस तरह:

public class ConnectionStringProvider<T> : IConnectionStringProvider<T> 
{ 
    public string Value 
    { 
     // use reflection to get name of T 
     // look up connection string based on the name 
     // return the connection string 
    } 
} 
... 
public class SomeRepository:ISomeRepository 
{ 
    public SomeRepository(IConnectionStringProvider<SomeRepository> connectionStringProvider) 
    { 
     this.connectionString = connectionStringProvider.Value; 
    } 
} 

भी है कि अगर काम नहीं करता है, तो आप एक गैर सामान्य IConnectionStringProvider कि तर्क के रूप में एक प्रकार लेता है हो सकता है:

public class ConnectionStringProvider : IConnectionStringProvider 
{ 
    public string GetValueFor(Type type) 
    { 
     // use reflection to get name of type 
     // look up connection string based on the name 
     // return the connection string 
    } 
} 
... 
public class SomeRepository:ISomeRepository 
{ 
    public SomeRepository(IConnectionStringProvider connectionStringProvider) 
    { 
     this.connectionString = connectionStringProvider.GetValueFor(this.GetType()); 
    } 
} 

यदि इन कार्यों में से एक तो वे इसका लाभ है कि उन्हें किसी भी डीआई कंटेनर के साथ काम करना चाहिए।