2016-07-24 28 views
1

Nach der DI sollten zwei separate Repository-Klassen erstellt werden, z.Konstruktorinjektion - Binden von zwei separaten Konfigurationsabhängigkeiten an eine Repository-Klasse

public class FirstDbRepo : Repository 

public class SecondDbRepo : Repository 

, die im Wesentlichen die Repository-Klasse implementieren Marker unten gezeigt

namespace MyApp.Persistence 
{ 
    public class Repository<T> : IRepository<T> where T : EntityBase 
    { 
     public IConfig Config { get; set; } 
     private Database Database 
     { 
      get 
      { 
       // Use Config to get connection 
      }; 
      set; 
     } 

     public Repository(IConfig config) 
     { 
      Config = config; 
     } 

     public IEnumerable<T> Get(Expression<Func<T, bool>> predicate) 
     { 
      // Use database to get items 
     } 

     public T CreateItem(T item) 
     { 
      // Use database to create item 
     } 
    } 
} 

Aber injizieren unterschiedliche Konfigurationswerte/Instanzen ...

public interface IConfig 
{ 
    string DatabaseName{ get; } 
    string DatabaseEndpoint{ get; } 
    string DatabaseAuthKey{ get; } 
} 

Das erste, was ich dachte, war zu schaffen Schnittstellen, aber wollte wissen, ob das riecht ... gibt es einen richtigen Weg, dies mit DI zu tun?

public interface IFirstDbRepo { } 

public class FirstDbRepo<T> : Repository<T> where T: EntityBase 
{ 
    public FirstDbRepo(FirstConfig config) 
     : base(config) 
    { } 
} 

public class FirstConfig : IConfig 
{ 
    public string DatabaseName{ get { return "MyName" }; } // From web.config 
} 

Und dann ein ninject verwenden für jede Repo-Bindung ... der Verbraucher wie folgt

public class Consumer() { 
    private readonly IFirstDbRepo _firstRepo; 
    public Consumer(IFirstDbRepo firstRepo) { 
     _firstRepo = firstRepo; 
    } 
} 
+0

Ihre 'Consumer' Klasse eine Abhängigkeit von der konkreten nutzen könnten hat Klasse 'FirstDbRepo' obwohl? Idealerweise wäre Ihr 'T' zwischen den beiden disjunkt, dann könnten Sie einfach aufteilen, welche Implementierung Sie basierend auf dem Typ von' T' erhalten, sonst würde ich hier stattdessen ein Factory-Muster rollen, aber es könnte einen besseren Weg geben: P – starlight54

+0

Die Verwendung von Marker-Interfaces ist ebenfalls gut, wenn Sie keine Kontextbindung einklagen wollen –

Antwort

1
Bind<IConfig>().To<MyConfigOne>().WhenInjectedInto(typeof(FirstDbRepo)); 
Bind<IConfig>().To<MyConfigTwo>().WhenInjectedInto(typeof(SecondDbRepo)); 

Contextual binding