2017-04-30 1 views
2

Ich brauche Hilfe von euch. Momentan arbeite ich an Dependency Injection in meiner Konsolenanwendung. In einer einzelnen Klasse habe ich drei Schichten definiert, um die Abhängigkeitsinjektion zu verstehen. Eigentlich versuche ich Objekt der Daten Access Layer zu injizieren, die entweder Oracle oder Sql basierend auf der Anforderung sein kann. Aber Injektion geschieht basierend darauf, welche Schicht zuletzt registriert ist. Können mir Jungs sagen, wie kann ich richtige Injektion machen?Warum injiziert die Abhängigkeitsinjektion das zuletzt registrierte Objekt?

UI SCHICHT:

class Program 
{ 
    static void Main(string[] args) 
    { 
     IUnityContainer objconatiner = new UnityContainer(); 
     objconatiner.RegisterType<Customer>(); 
     objconatiner.RegisterType<IDal, SqlserverDal>(); 
     objconatiner.RegisterType<IDal, OracleServerDal>(); 

     Customer ocust = objconatiner.Resolve<Customer>(); 
     ocust.CustName = "Taylor Swift"; 
     ocust.Add(); 
    } 
} 

Mittelschicht:

public class Customer 
{ 
    private IDal oidal; 
    public string CustName { get; set; } 

    public Customer(IDal idal) 
    { 
     oidal = idal; 
    } 

    public void Add() 
    { 
     oidal.Add(); 
    } 
} 

DAL SCHICHT:

public interface IDal 
{ 
    void Add(); 
} 

public class SqlserverDal : IDal 
{ 
    public void Add() 
    { 
     Console.Write("Now using Sql server"); 
    } 
} 

public class OracleServerDal : IDal 
{ 
    public void Add() 
    { 
     Console.Write("Now using Orcale server"); 
    } 
} 
+0

Wie erwarten Sie, dass der Container weiß, welchen Sie beheben möchten? Sollten Sie nicht eine Konfiguration überprüfen und nur eine dieser Dal-Implementierungen registrieren? –

+0

aber was, wenn ich sogar einige neue Dal-Ebene aufrufen möchte? Das ist, was ich fragen, wie sollte ich Abhängigkeit basierend auf Konfiguration injizieren.Und ich muss alle Objekte zu meinem Einheit Container registrieren, so dass ich alle Dal Ebenen registrieren müssen Aber wie sollte ich den Kongregationsteil passieren? – aksh1989

+0

@ aksh1989 Es ist nicht klar, ob Sie sowohl SQL als auch Oracle während der gleichen App-Ausführung benötigen und entweder auf der Grundlage der Bedingung injizieren ODER die Lebensdauer einer beliebigen App verwenden. – niksofteng

Antwort

0

Diese genaue Situation ist, wo genannt Anmeldungen ins Spiel kommen.

static void Main(string[] args) 
{ 
    IUnityContainer objconatiner = new UnityContainer(); 
    objconatiner.RegisterType<Customer>(); 
    objconatiner.RegisterType<IDal, SqlserverDal>("SqlServer"); 
    objconatiner.RegisterType<IDal, OracleServerDal>("Oracle"); 

    Customer ocust = objconatiner.Resolve<Customer>(); 
    ocust.CustName = "Taylor Swift"; 
    ocust.Add(); 
} 

public class Customer 
{ 
    private IDal oidal; 
    public string CustName { get; set; } 

    public Customer([Dependency("SqlServer")]IDal idal) 
    { 
     oidal = idal; 
    } 

    public void Add() 
    { 
     oidal.Add(); 
    } 
} 

Jetzt können beide Anmeldungen verwendet werden, aber Sie müssen angeben, welche Registrierung Sie über Namen wünschen, wenn Sie tun, um Ihre Lösung, so kann dies über Attribute erfolgen, wie ich oben oder über den Resolve Aufruf gezeigt haben, die in einem String nimmt .

+0

Vielen Dank. – aksh1989

Verwandte Themen