У меня есть приложение .net core web api, где я использую ядро Entity Framework с сервисным уровнем, единицей работы и шаблоном уровня хранилища.Для DI я использую Autofac.
Приложение имеет несколько клиентов и каждый клиент имеет свою собственную базу данных , и схема для всех этих баз данных одинакова. При каждом вызове API я получаю строку подключения, специфичную для клиента, с помощью которой мне приходится создавать DbContext и использовать его для всех его операций.
В классе запуска я зарегистрировал свой dbcontextClientDbContext и все другие классы.Когда вызывается класс единицы работы, я создаю свой новый DbContext на основе строки подключения.Я хочу, чтобы хранилище использовало этот экземпляр, , но хранилище все еще использует исходный экземпляр ClientDbContext, который был создан при запуске .
Как я могу заставить хранилище использовать новый DbContextэкземпляр?
Единица работы:
public class UnitOfWork : IUnitOfWork
{
public ClientDbContext ClientDbContext { get; private set; }
public UnitOfWork ()
{
}
public void SetDbContext(string connectionString)
{
if(ClientDbContext == null)
{
//creating new db context instance here
ClientDbContext = MembershipRepository.CreateDbContext(connectionString);
}
}
//property injection
public IGenericRepository<SomeEntity, ClientDbContext> SomeEntityGenericRepository { get; }
}
Общий репозиторий:
public class GenericRepository<TEntity, TDbContext> : IGenericRepository<TEntity, TDbContext> where TEntity : class
where TDbContext : DbContext
{
private readonly TDbContext _context;
private readonly DbSet<TEntity> _dbset;
public GenericRepository(TDbContext context)
{
// need to get updated context here, but getting the initial one
_context = context;
_dbset = _context.Set<TEntity>();
}
}
Модуль автозапуска вызывается в Startup.cs:
builder.Register(a => new ClientDbContext()).InstancePerLifetimeScope();
builder.RegisterGeneric(typeof(GenericRepository<,>)).As(typeof(IGenericRepository<,>)).InstancePerLifetimeScope();
//Register Unit of Work here
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerLifetimeScope().PropertiesAutowired();
//Register Services here
builder.RegisterType<SomeService>().As<ISomeService>().InstancePerLifetimeScope();
Может кто-нибудь помочь мне с выполнением вышеуказанного требования?
Можно ли как-нибудь заставить Autofac использовать мой новый созданный объект dbcontext?