2009-07-27 11 views
28

के साथ जेनेरिक इंटरफेस को हल करना निम्नलिखित कोड को देखते हुए, मैं ऑटोफैक में कुछ अंतर्दृष्टि को कैसे हल करूं?ऑटोफैक

public class BaseClass {} 

public class SubClass1 : BaseClass {} 

public class SubClass2 : BaseClass {} 

public interface IGenericInterface<T> where T : BaseClass {} 

public class SomeInstance1<T> : IGenericInterface<T> where T : SubClass1 

public class SomeInstance2<T> : IGenericInterface<T> where T : SubClass2 

मैं उप-वर्गों पर जेनेरिक के प्रकार के आधार पर कुछ इंस्टेंस 1 या 2 चुनना चाहता हूं।

तो उदाहरण के लिए मेरे पास उप वर्गों (सबक्लास 1, 2 ....) का संग्रह है और उन पर पुनरावृत्ति करते समय मैं कुछ इंस्टेंस कक्षा का चयन करना चाहता हूं।

उत्तर

59

ऑटोफ़ैक खुले जेनेरिक का समर्थन करता है। अगर जेनरिक प्रकार संकलन समय पर जाना जाता है आप नीचे दिए गए कोड का उपयोग कर सकते हैं:

var builder = new ContainerBuilder(); 

builder.RegisterGeneric(typeof(SomeInstance1<>)) 
    .As(typeof(IGenericInterface<>));    

var container = builder.Build(); 

var instance1 = container.Resolve<IGenericInterface<SubClass1>>(); 

Assert.IsInstanceOfType(typeof(SomeInstance1<SubClass1>), instance1); 

हैं प्रकार पैरामीटर रनटाइम तक ज्ञात नहीं है (जो की संभावना अपने मामले यदि आप प्रकार के संग्रह के माध्यम से पुनरावृति करना चाहते हैं) तो आप का निर्माण कर सकते MakeGenericType का उपयोग करके आपका प्रकार:

 var typeInRuntime = typeof (SubClass1); 
     var instance1 = container.Resolve(typeof(IGenericInterface<>).MakeGenericType(typeInRuntime)); 
1

सुधार। आप कंटेनर से MakeGenericType को कॉल नहीं कर सकते हैं। मैंने संकल्प कॉल पर पैरामीटर के रूप में 'प्रकार' का उपयोग करके जेनरिक्स को तत्काल करने का मुद्दा हल किया। निर्माता पंजीकृत है।

 builder.RegisterGeneric(typeof (FakeRepository<>)).As(typeof (IRepository<>)).OnActivating(e => 
     { 
      var typeToLookup = e.Parameters.FirstOrDefault() as TypedParameter; 
      if (typeToLookup != null) 
      { 
       var respositoryType = typeof (FakeRepository<>); 
       Type[] typeArgs = {typeToLookup.Value.GetType()}; 
       var genericType = respositoryType.MakeGenericType(typeArgs); 
       var genericRepository = Activator.CreateInstance(genericType); 
       e.ReplaceInstance(genericRepository); 
      } 
     }); 

तब संकल्प इस तरह होता है, एक टाइपेड पैरामीटर को हल करने के लिए पास करता है। इस मामले में मेरे पास आइटम (IItem) की एक सूची है जिसे हल किया गया है कि मैं उस प्रकार के सभी आइटमों के लिए एक संग्रह बनाना चाहता हूं।

 var items = container.Resolve<IEnumerable<IItem<string>>>(); 
     foreach (var item in items) 
     { 
      var repository = container.Resolve(typeof (IRepository<DataItemBase>), new TypedParameter(item.GetType(), item)); 
      Assert.IsNotNull(repository); 
     } 

आपकी पोस्ट के लिए धन्यवाद यह मदद करता है और मुझे उम्मीद है कि यह अद्यतन मदद करता है।

संबंधित मुद्दे