Ich plane, eine Webanwendung mit ASP.NET MVC mit Entity Framework 6 (Code First/POCO) zu entwickeln. Ich möchte auch generisches Repository und Unit of Work Pattern in meiner Anwendung verwenden. Diese Anwendung verbindet sich mit mehr als zwei Datenbanken, also muss ich mehrere DbContext in der Anwendung verwenden.Best Practice von Repository und Einheit der Arbeit Muster mit mehreren DbContext
public class ContextOne : DbContext
{
public DbSet<Model_One1>
public DbSet<Model_One2>
}
public class ContextTwo : DbContext
{
public DbSet<Model_Two1>
public DbSet<Model_Two2>
}
public class ContextThree : DbContext
{
public DbSet<Model_Three1>
public DbSet<Model_Three2>
}
public interface IRepository<T> where T : DbContext
{
void Add<T>(T entity) where T : class;
}
public class Repository<T> where T : DbContext
{
void Add<T>(T entity) where T : class
{
//T is DbContext and Model. So confusing
}
}
public interface IUnitOfWork<IRepository>
{
}
public class UnitOfWork<IRepository>
{
//IRepository contains more than one DbContext how can I initiate them here?
}
//in application should look like this
public class BaseController : Controller
{
protected IRepository repository = new .. //here I have no idea with multiple DbContext
}
public class HomeController : BaseController
{
public ActionResult Add(Model_Two2 model)
{
base.repository.Add<Model_Two2>(model)
}
}
Wenn ich die IRepository und IUnitOfWork von Controller-Aufruf, wie kann ich den passenden Kontext wissen? Was ist die beste Vorgehensweise für dieses Problem?
Wie soll ich das IRepository und IUnitOfWork in meinem BaseController aufrufen? Sollte ich für jedes Modell Hunderte von IRepository-Instanzen erstellen? Zum Beispiel: IRepository repositoryStudent = neues Repository() 'etc, etc. –
derodevil
Ich glaube nicht, dass' BaseController' der richtige Ort wäre, um eine UoW zu initiieren. Stattdessen sollte es auf Anfrage auf der Ebene Ihres Geschäftsprozesses erstellt werden. Erstellen Sie daher spezifische UOW basierend auf DbContexts nach Bedarf und erhalten Sie dann spezifische Repositories. – ramiramilu
Da Ihr 'UnitOfWork' keinen Destruktor und keine verwalteten Ressourcen hat, müssen Sie' GC.SuppressFinalize (this) 'nicht aufrufen und müssen kein Dispose-Pattern implementieren. Sie müssen nur '_context.Dispose()' in 'UnitOfWork.Dispose' aufrufen – Albert