11

यह सुनिश्चित नहीं है कि यह संभव है या नहीं।क्या मैं पैरामीटर के आधार पर कार्यान्वयन को वापस करने के लिए टाइप की गई फैक्ट्री सुविधा का उपयोग कर सकता हूं?

मुझे एनम मूल्य के आधार पर सेवा के सही कार्यान्वयन को वापस करने की आवश्यकता है। तो हाथ कोडित कार्यान्वयन कुछ ऐसा दिखाई देगा:

public enum MyEnum 
{ 
    One, 
    Two 
}  

public class MyFactory 
{ 
    public ITypeIWantToCreate Create(MyEnum type) 
    { 
    switch (type) 
    { 
     case MyEnum.One 
      return new TypeIWantToCreate1(); 
      break; 
     case MyEnum.Two 
      return new TypeIWantToCreate2(); 
      break; 
     default: 
      return null;  
    }  
    } 
} 

कार्यान्वयन लौटाए गए अतिरिक्त निर्भरता जो कंटेनर के माध्यम से इंजेक्ट किया जा करने की आवश्यकता होगी है, तो एक हाथ से लुढ़का कारखाना काम नहीं करेगा।

क्या यह संभव है, और यदि ऐसा है तो पंजीकरण कैसा दिखता है?

+0

क्या अपने कंटेनर में है कि कारखाना पंजीकरण के साथ कुछ गड़बड़ है, इसका चयनकर्ता के रूप में इस्तेमाल किया जाएगा, और बजाय 'नई Type1' करने का, बस कंटेनर में वापस बुला? – Steven

+0

मैं सीधे कंटेनर से हल नहीं करना चाहता - मुझे कोड में इस बिंदु पर कंटेनर तक पहुंच नहीं होगी। –

+0

अपने आवेदन के [रचना रूट] (http://blog.ploeh.dk/2011/07/28/CompositionRoot.aspx) का उस कारखाना भाग बनाएं (और इसे 'IMyFactroy' इंटरफ़ेस पर निर्भर करता है जो कि इसका हिस्सा है आवेदन पत्र)। उस स्थिति में कंटेनर तक पहुंचना ठीक है ([यह * सेवा लोकेटर एंटी-पैटर्न नहीं है] (http://blog.ploeh.dk/2011/08/25/ServiceLocatorRolesVsMechanics.aspx))। बस कारखाने के निर्माता में कंटेनर इंजेक्ट करें और आप ठीक हैं। – Steven

उत्तर

8

तो कंटेनर घटक आईडी के रूप में enum मूल्य निर्दिष्ट करने में अपने घटक के पंजीकरण के एक विकल्प है, तो आप इस दृष्टिकोण भी

public class ByIdTypedFactoryComponentSelector : DefaultTypedFactoryComponentSelector 
{ 
     protected override string GetComponentName(MethodInfo method, object[] arguments) 
     { 
      if (method.Name == "GetById" && arguments.Length > 0 && arguments[0] is YourEnum) 
      { 
       return (string)arguments[0].ToString(); 
      } 

      return base.GetComponentName(method, arguments); 
     } 
} 

ByIdTypedFactoryComponentSe से विचार कर सकता है पाठभेद अपने टाइप कारखाने

public enum YourEnum 
{ 
    Option1 
} 

public IYourTypedFactory 
{ 
    IYourTyped GetById(YourEnum enumValue) 
} 


container.AddFacility<TypedFactoryFacility>(); 
container.Register 
(  
    Component.For<ByIdTypedFactoryComponentSelector>(), 

    Component.For<IYourTyped>().ImplementedBy<FooYourTyped>().Named(YourEnum.Option1.ToString()), 

    Component.For<IYourTypedFactory>() 
    .AsFactory(x => x.SelectedWith<ByIdTypedFactoryComponentSelector>()) 
    .LifeStyle.Singleton, 

    ... 
+0

क्या होगा अगर TypeIWantToCreate1 या TypeIWantToCreate2 आवश्यक पैरामीटर? पहला घटक घटक को खोजने के लिए समर्पित था और दूसरों को घटक उदाहरण में इंजेक्शन दिया जाएगा? –

1

ऐसा लगता है कि यह संभव है। इस पर एक नज़र डालें:।

Example

आप केवल वर्गों आप में रुचि रखते हैं के लिए कॉल को हल करने कॉल का समाधान करने का ITypedFactoryComponentSelector कार्यान्वयन बनाने की आवश्यकता होगी, और कंटेनर में रजिस्टर