UOW + Репозиторий + Autofac загрузить два разных DbContext
У меня сегодня проблема, и я не могу ее решить, я много искал и не могу найти решение, пожалуйста, помогите мне, если сможете.
Я реализую приложение MVC, которое использует EF + Шаблон репозитория + Единица работы с Autofac в качестве инжектора зависимостей.
Мне удалось работать с одним классом DbContext, но я столкнулся с ситуацией, когда мне нужно использовать другой экземпляр DbContext (который обращается к другой базе данных с другими учетными данными пользователя)
Позвольте мне объяснить лучше: у меня есть EntityA, который поступает из базы данных A (и у меня есть класс DatabaseA_Context). Поэтому мне нужен EntityB, который поступает из базы данных B (с собственным классом DatabaseB_Context).
Когда я регистрирую их в AutoFac, в реализацию GenericRepository вводится только последняя настроенная зависимость.
Я уже нашел статьи о том, что Autofac переопределяет регистрацию последним значением.
Я уже нашел другую статью, в которой показано, что если я передам IEnumerable в конструкторе UnitOfWork, я смогу просмотреть все зарегистрированные типы для него, но мне нужен конкретный.
Я достаточно ясно?
Мой код ниже:
Мой контроллер:
public class MyController : Controller
{
private readonly IBaseBLL<EntityA> _aBLL;
private readonly IBaseBLL<EntityB> _bBll;
public MyController(IBaseBLL<EntityA> aBLL, IBaseBLL<EntityB> bBLL)
{
_aBLL = aBLL;
_bBLL = bBLL;
}
}
Мой бизнес уровень
public interface IBaseBLL<T> where T : class
{
T Select(Expression<Func<T, bool>> predicate);
T AddT entity);
void Update(T entity);
T Delete(T entity);
}
public class BaseBLL<T> : IBaseBLL<T> where T : class
{
private readonly IUnitOfWork _uow;
public BaseBLL(IUnitOfWork uow)
{
_uow = uow;
}
//implementation goes here...
}
Моя реализация UOW
public interface IUnitOfWork : IDisposable
{
int SaveChanges();
IGenericRepository<T> Repository<T>() where T : class;
}
public class UnitOfWork : IUnitOfWork
{
private readonly DbContext _dbContext;
private bool disposed = false;
private Dictionary<Type, object> repositories;
public UnitOfWork(DbContext dbContext)
{
_dbContext = dbContext;
repositories = new Dictionary<Type, object>();
}
public IGenericReposity<T> Repository<T>() where T : class
{
if (repositories.Keys.Contains(typeof(T)))
return repositories[typeof(T)] as IGenericReposity<T>;
IGenericReposity<T> repository = new GenericRepository<T>(_dbContext);
repositories.Add(typeof(T), repository );
return repository ;
}
public int SaveChanges()
{
return _dbContext.SaveChanges();
}
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
if (disposing)
_dbContext.Dispose();
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
Моя реализация репозитория
public class GenericRepository<T> : IGenericRepositoryT> where T : class
{
protected readonly DbContext _dbContext;
protected IDbSet<T> _dbSet;
public GenericRepository(DbContext dbContext)
{
_dbContext = dbContext;
_dbSet = _dbContext.Set<T>();
}
//implementation goes here...
}
Моя регистрация в AutoFac (в файле Global.asax)
var builder = new ContainerBuilder();
builder.RegisterType(typeof(DatabaseA_Context)).As(typeof(DbContext)).InstancePerLifetimeScope();
builder.RegisterType(typeof(DatabaseB_Context)).As(typeof(DbContext)).InstancePerLifetimeScope();
builder.RegisterType(typeof(UnitOfWork)).As(typeof(IUnitOfWork)).InstancePerRequest();
Пожалуйста помоги