यह प्रश्न मेरे पिछले प्रश्न का अनुवर्ती है: Autofac: Hiding multiple contravariant implementations behind one composite।ऑटोफैक: दोनों प्रकार और बाहर तर्क प्रकारों के साथ वेरिएंट प्रकारों को हल करना
मैं ऑटोफैक के कॉन्वर्सिस और contravariance समर्थन के साथ क्या कर सकता है की सीमाओं को खोजने की कोशिश कर रहा हूं। मैंने देखा कि ऑटोफैक का ContravariantRegistrationSource
केवल एक सामान्य जेनेरिक पैरामीटर के साथ जेनेरिक इंटरफेस का समर्थन करता है जो in
कीवर्ड के साथ चिह्नित है। ऐसा लगता है कि इस सुविधा की उपयोगिता सीमित है, और मैं सोच रहा हूं कि ऑटोफैक के पास कॉन्वर्सिस और contravariance के समर्थन को बढ़ाने में अन्य तरीके हैं।
मुझे यह स्वीकार करना होगा कि मैं एक असली एप्लिकेशन डिज़ाइन के कारण यह नहीं पूछ रहा हूं। मैं जानबूझ कर शिक्षा के लिए ऑटोफैक की सीमाएं खोजने की कोशिश कर रहा हूं।
public interface IConverter<in TIn, out TOut>
{
TOut Convert(TIn value);
}
और निम्नलिखित कार्यान्वयन:
public class ObjectToStringConverter : IConverter<object, string>
{
string IConverter<object, string>.Convert(object value)
{
return value.ToString();
}
}
और निम्नलिखित registation:
तो निम्नलिखित इंटरफेस पर विचार
var builder = new ContainerBuilder();
builder.RegisterSource(new ContravariantRegistrationSource());
builder.RegisterType<ObjectToStringConverter>()
.As<IConverter<object, string>>();
var container = builder.Build();
इस डिजाइन और विन्यास के साथ, मैं था ऐसा करने में सक्षम होने की उम्मीद है:
// This call succeeds because IConverter<object, string> is
// explicitly registered.
container.Resolve<IConverter<object, string>>();
// This call fails, although IConverter<string, object> is
// assignable from IConverter<object, string>.
container.Resolve<IConverter<string, object>>();
या मुझे इसे और अधिक संक्षेप में डाल दिया, यह देखते हुए परिभाषा के साथ करते हैं: निम्नलिखित कॉल सफल होने के लिए
builder.RegisterType<AToCConverter>()
.As<IConverter<C, A>>();
मैं उम्मीद करेंगे:
public class A { }
public class B : A { }
public class C : B { }
public class AToCConverter : IConverter<A, C> { ... }
और निम्नलिखित पंजीकरण
container.Resolve<IConverter<C, A>>();
container.Resolve<IConverter<B, B>>();
container.Resolve<IConverter<A, C>>();
हम ऑटोफैक के साथ ऐसा कैसे कर सकते हैं?
1 के साथ समानता की जांच contravariant पैरामीटर की संख्या गिनती है; अन्य (गैर-contravariant) पैरामीटर की मनमानी संख्या अभी भी संभाला जा सकता है। चीयर्स! –