Вы можете переместить вашу логику для создания ClientContext
в другой ответственный класс (в соответствии с принципами SOLID), например, DbContextFactory
, и хранить там созданные DbContext
для каждого клиента.Например:
public class DbContextFactory
{
private readonly IConfiguration _configuration;
private readonly Dictionary<string, ClientDbContext> _clientContexts = new Dictionary<string, ClientDbContext>();
public DbContextFactory(IConfiguration configuration)
{
_configuration = configuration;
}
public ClientDbContext GetOrCreateClientContext(string clientNumber)
{
// if you have context already created - return it
if (_clientContexts.ContainsKey(clientNumber))
return _clientContexts[clientNumber];
var optionsBuilder = new DbContextOptionsBuilder<ClientDbContext>();
var clientConnection = string.Format(_configuration.GetConnectionString("clientConnection"), clientNumber);
optionsBuilder.UseSqlServer(clientConnection);
var clientDbContext = new ClientDbContext(optionsBuilder.Options);
_clientContexts[clientNumber] = clientDbContext;
return clientDbContext;
}
}
Затем в рабочем классе вы можете сгруппировать данные по ClientNumber
, для каждого клиента создать (или получить уже созданный) DbContext
и репозиторий, а затем выполнить обновление данных.
public class Worker
{
private readonly DbContextFactory _factory;
public Worker(DbContextFactory factory)
{
_factory = factory;
}
public async Task DoWorkAsync()
{
// group by ClientNumber
var groupedCases = caseList.GroupBy(x => x.ClientNumber);
foreach (var groupedCase in groupedCases)
{
// For each client create context and repository
var clientContext = _factory.GetOrCreateClientContext(groupedCase.Key);
var clientRepository = new ClientRepository(clientContext);
foreach (var @case in groupedCases)
{
var updatedCase = // transform case here
await clientRepository.CreateCases(updatedCase);
}
}
}
}
Вы можете использовать внедрение зависимостей или просто создать эти предложения следующим образом:
var factory = new DbContextFactory(yourConfiguration);
var worker = new Worker(factory);
await worker.DoWorkAsync();