0

Ich bin neu in Dependency injection Pattern. Bitte schauen Sie sich das folgende Szenario an. Im Moment ist mein Code unten eng gekoppelt. Ich möchte das so leicht gekoppelt machen.Wie registriert man parametrisierbare Konstruktorklassen im Unity-Container in C#?

Könnte jemand mir helfen, Abhängigkeitsinjektion mit Unity zu implementieren?

// Implementation of class A 
public class A 
{ 
    public B b{get;set;} 
    public A(B b,string c) 
    { 
    this.b=b; 
    this.A(b,c); 
    } 
} 

//Implementation of Class B 
public class B 
{ 
    public int value1 {get;private set;} 
    public string stringValue {get;private set;} 

    public B(int value,string strValue) 
    { 
     this.value1=value; 
     this.stringValue=strValue; 
    } 
} 
//Implementation of class C 
public class C 
{ 
    public void Dosomething() 
    { 
    B b=null; 
    string value="Something"; 
    // Here I need to implement unity to resolve tight coupling 
    // without creating object of Class A 
    A a=new A(b,value); 

    } 
} 

Ich müde etwas basierend auf den Schlag mögliche doppelte Frage. Aber ich stehe immer noch vor demselben Problem.

Wie soll ich diesen Typ registrieren, der Konstruktor in Unity parametrisiert hat?

Anstelle dieser Linie habe ich den folgenden Code implementiert

 A a=new A(b,value); 

var container=new UnityContainer(); 
container.RegisterType<A>(); 
container.RegisterType<B>(); 
A a=new A(b,container.ResolveType<B>(); 

Aber sein hilft mir nicht aus.

+0

Mögliche Duplikate von [Wie soll ich diesen Typ registrieren, der den Konstruktor in Unity parametrisiert hat?] (Http://stackoverflow.com/questions/13067496/how-should-i-register-this-type-that-has -Parameterized-Konstruktor-in-Einheit) – dbugger

Antwort

1

Erstens würde ich anfangen werden, die Empfehlung, dass Sie weiterhin Ihre Klassen entkoppeln von Schnittstellen Einführung so könnten Sie Klasse C wie folgt implementieren:

public class C 
{ 
    private readonly IA a; 

    private readonly IB b; 

    public C(IA a, IB b) 
    { 
     this.a = a; 
     this.b = b; 
    } 

    public void Dosomething() 
    { 
     // do something with this.a or this.b. 
    } 
} 

Sie könnten dann registrieren Sie sich und Ihre Klassen zu lösen, wie unten:

var container = new UnityContainer(); 

     container.RegisterType<IB, B>(new InjectionConstructor(1, "Test")); 
     container.RegisterType<IA, A>(new InjectionConstructor(new ResolvedParameter<IB>(),"Test")); 
     container.RegisterType<IC, C>(); 

     var c = container.Resolve<IC>(); 

Obwohl würde ich den obigen Ansatz empfehlen, alternativ können Sie auch die Injektion Werte festlegen, wenn Sie beheben, zum Beispiel:

container.RegisterType<IB, B>(); 

container.Resolve<IB>(
      new ParameterOverride("value", 1), 
      new ParameterOverride("strValue", "Test"));