2011-12-07 6 views
5

पृष्ठभूमि

पर जरूरत मदद आईओसी की मेरी समझ में सुधार है और यह कैसे उपयोग करने के लिए, मैं सभी तीन आईओसी तकनीक का एक उदाहरण बनाना चाहते हैं मदद करने के लिए: निर्माता इंजेक्शन, सेटर इंजेक्शन, और एक तीसरे पक्ष के ढांचे का उपयोग किए बिना इंटरफेस इंजेक्शन। मुझे लगता है कि मेरे पास कन्स्ट्रक्टर इंजेक्शन का मूल उदाहरण है, लेकिन सेटटर और इंटरफेस इंजेक्शन के साथ संघर्ष कर रहा है।कस्टम आईओसी कंटेनर 2/3 प्रकार

मेरे प्रश्न

कैसे आप जमीन से लेखन इंटरफेस और सेटर इंजेक्शन से निपटने दृष्टिकोण है?

यहां मेरे विचार हैं, अगर मुझे सही रास्ते पर है तो मुझे बताएं।

इंटरफ़ेस इंजेक्शन:

हल हो गई वस्तुओं के माध्यम से
  1. लूप निर्माता इंजेक्शन का उपयोग कर, यह देखने के लिए कि क्या इंटरफेस interfaceDependencyMap
  2. में लागू किया जाता है interfaceDependencyMap किसी प्रकार परिभाषित कार्यान्वयन के लिए एक इंटरफेस संबद्ध करने के लिए जाँच instantiated।
  3. interfaceDependencyMap
  4. का उपयोग कर कार्यान्वयन का समाधान करें
  5. वस्तु निर्माता इंजेक्शन के साथ प्रारंभ करने के लिए उपयुक्त गुण निरुपित

सेटर इंजेक्शन:

  1. हल हो गई वस्तुओं के माध्यम से लूप निर्माता इंजेक्शन का उपयोग कर instantiated
  2. कुछ को परिभाषित करें setterInjectionMap का प्रकार
  3. अपेक्षित पैरामीटर को हल करें MethodInfo निर्माता मैपिंग का उपयोग कर
  4. कॉल सेटर विधि का समाधान पैरामीटर वस्तु

यहाँ से गुजर रहा है कि मैं क्या अब तक निर्माता इंजेक्शन

public class Program 
{ 
    static void Main(string[] args) 
    { 
     // 
     //instead of doing this: 
     // 
     //ICreditCard creditCard = new Visa(); 
     //var customer = new Customer(creditCard); 
     //customer.Charge(); 


     var resolver = new Resolver(); 

     //map the types in the container 
     resolver.Register<Customer, Customer>(); 
     resolver.Register<ICreditCard, Visa>(); 

     //because the customer constructor has an ICreditCard parameter 
     //our container will automatically instantiate it recursively 
     var customer = resolver.Resolve<Customer>(); 

     customer.Charge(); 

    } 
} 

public interface ICreditCard 
{ 
    string Charge(); 
} 

public class Visa : ICreditCard 
{ 
    public string Charge() 
    { 
     return "Charging Visa"; 
    } 
} 

public class MasterCard : ICreditCard 
{ 
    public string Charge() 
    { 
     return "Charging MasterCard"; 
    } 
} 

public class Customer 
{ 
    private readonly ICreditCard _creditCard; 

    public Customer(ICreditCard creditCard) 
    { 
     this._creditCard = creditCard; 
    } 

    public void Charge() 
    { 
     _creditCard.Charge(); 
    } 
} 


public class Resolver 
{ 
    private Dictionary<Type, Type> dependencyMap = new Dictionary<Type, Type>(); 

    public T Resolve<T>() 
    { 
     return (T) Resolve(typeof (T)); 
    } 

    private object Resolve(Type typeToResolve) 
    { 
     Type resolvedType = null; 

     try 
     { 
      resolvedType = dependencyMap[typeToResolve]; 
     } 
     catch 
     { 
      throw new Exception(string.Format("could not resolve type {0}", typeToResolve.FullName)); 
     } 

     var firstConstructor = resolvedType.GetConstructors().First(); 
     var constructorParameters = firstConstructor.GetParameters(); 
     if (constructorParameters.Count() == 0) 
      return Activator.CreateInstance(resolvedType); 

     IList<object> parameters = constructorParameters.Select(parameterToResolve => Resolve(parameterToResolve.ParameterType)).ToList(); 

     return firstConstructor.Invoke(parameters.ToArray()); 
    } 

    public void Register<TFrom, TTo>() 
    { 
     dependencyMap.Add(typeof (TFrom), typeof (TTo)); 
    } 
} 
+5

और सवाल क्या है? – svick

+0

क्या कोई तरीका है कि मैं इसे फिर से खोल सकता हूं? –

+0

@EricRomanowski: सवाल बंद होने के कारण नीचे दिए गए कारण देखें; यदि आप अपने प्रश्न में उन कारणों को संबोधित कर सकते हैं, तो अन्य इसे फिर से खोलने के लिए वोट दे सकते हैं, मानते हैं कि उन्हें लगता है कि यह एसओ पर प्रश्नों के मानकों को पूरा करता है। – casperOne

उत्तर

3

के लिए है कि आप जो खोज रहे हैं इस तरह का है ?

class Container 
{ 
    class Registration 
    { 
     public Type RegistrationType; 
     public Func<Container, object> Resolver; 
    } 

    List<Registration> registrations = new List<Registration>(); 

    public object Resolve(Type type) 
    { 
     return registrations 
      .First(r => type.IsAssignableFrom(r.RegistrationType)) 
      .Resolver(this); 
    } 

    public T Resolve<T>() 
    { 
     return (T)Resolve(typeof(T)); 
    } 

    public void Register<T>(Func<Container, T> registration) where T : class 
    { 
     registrations.Add(new Registration() 
     { 
      RegistrationType = typeof(T), 
      Resolver = registration 
     }); 
    } 
} 

उपयोग:

interface IDependency 
{ 
    string GetName(); 
} 

class ConcreteDependency : IDependency 
{ 
    public string GetName() 
    { 
     return "Concrete Dependency"; 
    } 
} 

class ConstructorExample 
{ 
    readonly IDependency dependency; 

    public ConstructorExample(IDependency dependency) 
    { 
     this.dependency = dependency; 
    } 

    public string GetString() 
    { 
     return "Consumer of " + dependency.GetName(); 
    } 
} 

class SetterExample 
{ 
    public IDependency Dependency { get; set; } 

    public string GetString() 
    { 
     return "Consumer of " + Dependency.GetName(); 
    } 
} 

[TestMethod] 
public void MyTestMethod() 
{ 
    var container = new Container(); 
    container.Register<IDependency>(c => new ConcreteDependency()); 
    container.Register(c => new ConstructorExample(c.Resolve<IDependency>())); 
    container.Register(c => new SetterExample() { Dependency = c.Resolve<IDependency>() }); 

    var constructor = container.Resolve<ConstructorExample>(); 
    Assert.AreEqual("Consumer of Concrete Dependency", constructor.GetString()); 

    var setter = container.Resolve<SetterExample>(); 
    Assert.AreEqual("Consumer of Concrete Dependency", setter.GetString()); 
} 

आप और अधिक उन्नत प्राप्त करना चाहते हैं, मैं इनमें से किसी भी का स्रोत हो रही सिफारिश करेंगे: SimpleInjector, Autofac, Ninject, StructureMap

+0

आपको बहुत बहुत धन्यवाद। मैं पिछले तीन दिनों से इंटरफेस और सेटर के लिए जेनेरिक लिखने का प्रयास करने की कोशिश कर रहा था (यकीन नहीं है कि यह उचित शब्दावली है)। –

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

  • कोई संबंधित समस्या नहीं^_^