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;
}
}
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
Die Verwendung von Marker-Interfaces ist ebenfalls gut, wenn Sie keine Kontextbindung einklagen wollen –