À l'aide de plusieurs DbContexts avec un générique du référentiel et de l'unité de travail

Ma demande est de s'agrandir et pour l'instant j'ai un seul MyDbContext qui a toutes les tables dont j'ai besoin dans mon application. Je souhaite (pour des raisons de présentation) à les diviser en plusieurs DbContext, comme MainDbContext, EstateModuleDbContext, AnotherModuleDbContext et UserDbContext.

Je ne sais pas comment cela se fait probablement que je suis maintenant à l'aide de l'injection de dépendance au (ninject) à la place de mon DbContext sur mon UnitOfWork classe comme:

kernel.Bind(typeof(IUnitOfWork)).To(typeof(UnitOfWork<MyDbContext>));

Devrais-je abandonner cette approche avec l'injection de dépendance et explicite l'ensemble de la DbContext je veux l'utiliser sur mes services comme:

private readonly EstateService _estateService;

public HomeController()
{
    IUnitOfWork uow = new UnitOfWork<MyDbContext>();
    _estateService = new EstateService(uow);
}

Au lieu de:

private readonly EstateService _estateService;

public HomeController(IUnitOfWork uow)
{
    _estateService = new EstateService(uow);
}

Ou ce il une autre meilleure approche? Aussi que d'un côté de la question, je n'aime pas passer le uow à mon service - est-il une autre (mieux)?

Code

J'ai cette IDbContext et MyDbContext:

public interface IDbContext
{
    DbSet<T> Set<T>() where T : class;

    DbEntityEntry<T> Entry<T>(T entity) where T : class;

    int SaveChanges();

    void Dispose();
}

public class MyDbContext : DbContext, IDbContext
{
    public DbSet<Table1> Table1 { get; set; }
    public DbSet<Table2> Table1 { get; set; }
    public DbSet<Table3> Table1 { get; set; }
    public DbSet<Table4> Table1 { get; set; }
    public DbSet<Table5> Table1 { get; set; }
    /* and so on */

    static MyDbContext()
    {
        Database.SetInitializer<MyDbContext>(new CreateDatabaseIfNotExists<MyDbContext>());
    }

    public MyDbContext()
        : base("MyDbContext")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

    }
}

Puis j'ai cette IRepository et la mise en œuvre:

public interface IRepository<T> where T : class
{
IQueryable<T> GetAll();
void Add(T entity);
void Delete(T entity);
void DeleteAll(IEnumerable<T> entity);
void Update(T entity);
bool Any();
}
public class Repository<T> : IRepository<T> where T : class
{
private readonly IDbContext _context;
private readonly IDbSet<T> _dbset;
public Repository(IDbContext context)
{
_context = context;
_dbset = context.Set<T>();
}
public virtual IQueryable<T> GetAll()
{
return _dbset;
}
public virtual void Add(T entity)
{
_dbset.Add(entity);
}
public virtual void Delete(T entity)
{
var entry = _context.Entry(entity);
entry.State = EntityState.Deleted;
_dbset.Remove(entity);
}
public virtual void DeleteAll(IEnumerable<T> entity)
{
foreach (var ent in entity)
{
var entry = _context.Entry(ent);
entry.State = EntityState.Deleted;
_dbset.Remove(ent);
}
}
public virtual void Update(T entity)
{
var entry = _context.Entry(entity);
_dbset.Attach(entity);
entry.State = EntityState.Modified;
}
public virtual bool Any()
{
return _dbset.Any();
}
}

Et la IUnitOfWork et la mise en œuvre qui gère le travail effectué avec le DbContext

public interface IUnitOfWork : IDisposable
{
IRepository<TEntity> GetRepository<TEntity>() where TEntity : class;
void Save();
}
public class UnitOfWork<TContext> : IUnitOfWork where TContext : IDbContext, new()
{
private readonly IDbContext _ctx;
private readonly Dictionary<Type, object> _repositories;
private bool _disposed;
public UnitOfWork()
{
_ctx = new TContext();
_repositories = new Dictionary<Type, object>();
_disposed = false;
}
public IRepository<TEntity> GetRepository<TEntity>() where TEntity : class
{
//Checks if the Dictionary Key contains the Model class
if (_repositories.Keys.Contains(typeof(TEntity)))
{
//Return the repository for that Model class
return _repositories[typeof(TEntity)] as IRepository<TEntity>;
}
//If the repository for that Model class doesn't exist, create it
var repository = new Repository<TEntity>(_ctx);
//Add it to the dictionary
_repositories.Add(typeof(TEntity), repository);
return repository;
}
public void Save()
{
_ctx.SaveChanges();
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (this._disposed) return;
if (disposing)
{
_ctx.Dispose();
}
this._disposed = true;
}
} 
Il y a aucune logique coutures de répartition des données sur plusieurs dbcontexts? Si vous faites cela, vous ne serez pas en mesure d'avoir de navigation ou de la collection de propriétés qui traversent les contextes (par exemple, vous ne pouvez pas faire un EF relation entre une entité dans MainDbContext et une autre entité dans UsersDbContext).
Quelle est la raison pour fendre le contexte de toute façon? Aussi, si vous le partagez , vous ne pouvez pas utiliser DI. J'ai aussi n'a pas comme votre unité de travail ayant respository(Dictionnaire de la chose)
Je vais être le fait d'avoir plusieurs modules dans mon application, et juste de ne pas polluer le MyDbContext avec beaucoup de modules DbSets. Peut-être que je devrais juste l'ignorer?
Salut Dan, pouvez-vous proposer une meilleure approche. Je suis ouverte aux suggestions
J'ai voulu faire ce strictement en raison de "IdentityDbContext' (MVC5 & OWIN) avec les transactions qui comprennent mon AppDbContext'. Le UserManager est de trouver et dandy, mais j'aimerais un peu plus de contrôle lors de la modification faiblement couplés de données relationnelles entre les deux.

OriginalL'auteur janhartmann | 2013-12-12