मैं एकता कंटेनर में एक अजीब व्यवहार देख रहा हूं, जब दो इंटरफेस के साथ काम करते हैं, तो दोनों एक ही सजावटी के लिए पंजीकरण करते हैं। एक कोड उदाहरण स्पष्ट होगा।एकता: दो इंटरफेस के लिए एक ही प्रकार का पंजीकरण
मैं निम्नलिखित वर्ग पदानुक्रम है:
public interface IBaseInterface
{
}
public interface IInterface1: IBaseInterface
{
}
public interface IInterface2: IBaseInterface
{
}
public class Interface1Impl : IInterface1
{
}
public class Interface2Impl : IInterface2
{
}
public class BaseInterfaceDecorator: IInterface1,IInterface2
{
private readonly IBaseInterface baseInterface;
public BaseInterfaceDecorator(IBaseInterface baseInterface)
{
this.baseInterface = baseInterface;
}
}
public class MyClass
{
private readonly IInterface1 interface1;
public MyClass(IInterface1 interface1)
{
this.interface1 = interface1;
}
}
और यह पंजीकरण कोड है:
var container = new UnityContainer();
container.RegisterType<IInterface1, BaseInterfaceDecorator>(
new InjectionConstructor(
new ResolvedParameter<Interface1Impl>()));
container.RegisterType<IInterface2, BaseInterfaceDecorator>(
new InjectionConstructor(
new ResolvedParameter<Interface2Impl>()));
var dependency = container.Resolve<MyClass>();
जब MyClass को हल करने मैं Interface2Impl बजाय Interface1Impl के साथ एक BaseInterfaceDecorator हो रही है। मुझे अजीब लग रहा है। क्या तुम समझा सकते हो?
मामले में यह पाठकों के लिए स्पष्ट नहीं है; आंतरिक रूप से एकता 'टू' प्रकार की बिल्ड कुंजी (उदाहरण के लिए जेनेरिक हस्ताक्षर में 'टीटीओ' कैश करती है। अगली बार जब आप 'टीटीओएम' के लिए बिल्ड कुंजी का निर्माण करते हैं तो 'टीटीओ' के लिए बिल्ड कुंजी का उपयोग किया जाता है। यह बिल्ड कुंजी जीवनभर प्रबंधक से भी जुड़ी हुई है और इस प्रकार यूनिटी टीटीओ (टीएफआरओएम की पहचान के बावजूद) के सभी अनुक्रमित संकल्पों के लिए पहले उपयोग किए गए आजीवन प्रबंधक (बिल्ड अप में) का उपयोग करने लगता है। यह एकता के साथ एक बग है कुंजी बनाएं कामकाज नामित पंजीकरण का उपयोग करना है, जो प्रतिष्ठित प्रकार की पहचान को पहचानने में बिंदु को हरा देता है। –