Dans mon application, j'ai besoin d'interagir avec deux bases de données. J'ai deux classes de domaine qui sont situées dans deux bases de données différentes. J'ai aussi un modèle de dépôt générique qui accepte un UoW dans son constructeur. Je cherche un moyen d'injecter un UoW approprié basé sur la classe de domaine. Je ne veux pas écrire un deuxième référentiel générique pour la deuxième base de données.. Y a-t-il une solution soignée?Injecter différents DbContexts dans un référentiel générique basé sur la classe Domain - Autofac
public interface IEntity
{
int Id { get; set; }
}
Situé dans la base de données A
public class Team: IEntity
{
public int Id { get; set; }
public string Name{ get; set; }
}
Situé dans la base de données B
public class Player: IEntity
{
public int Id { get; set; }
public string FullName { get; set; }
}
J'ai aussi un modèle de référentiel générique avec UOW
public interface IUnitOfWork
{
IList<IEntity> Set<T>();
void SaveChanges();
}
public class DbADbContext : IUnitOfWork
{
public IList<IEntity> Set<T>()
{
return new IEntity[] { new User() { Id = 10, FullName = "Eric Cantona" } };
}
public void SaveChanges()
{
}
}
public class DbBDataContext: IUnitOfWork
{
public IList<IEntity> Set<T>()
{
return new IEntity[] { new Tender() { Id = 1, Title = "Manchester United" } };
}
public void SaveChanges()
{
}
public interface IRepository<TEntity> where TEntity: class, IEntity
{
IList<IEntity> Table();
}
public class BaseRepository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity
{
protected readonly IUnitOfWork Context;
public BaseRepository(IUnitOfWork context)
{
Context = context;
}
IList<IEntity> IRepository<TEntity>.Table()
{
return Context.Set<TEntity>();
}
}
J'ai déjà trouvé des articles disant que Autofac remplace l'enregistrement avec la dernière valeur. Je sais que mon problème est de savoir comment DbContexts sont enregistrés.
var builder = new ContainerBuilder();
// problem is here
builder.RegisterType<DbADbContext >().As<IUnitOfWork>()
builder.RegisterType<DbBDbContext >().As<IUnitOfWork>()
builder.RegisterGeneric(typeof(BaseRepository<>)).As(typeof(IRepository<>));
var container = builder.Build();
cela ne fonctionnera pas, le premier ne correspond pas à mes points. le second n'est pas non plus une solution car la résolution dépend du type de 'TEntity' dans le Repository voir ici pour plus d'informations sur les Named et Meta data http://docs.autofac.org/en/latest/ faq/select-by-context.html # option-4-use-metadata – Mahdi