У меня есть клиент api ICommunicationClient(url, tenant)
, зарегистрированный в моем контейнере IoC. Теперь я столкнулся со сценарием, где у меня может быть 1 до n api клиентов. Мне нужно зарегистрировать их все, и я не уверен, как с этим справиться. Я видел, что в SI есть RegisterCollection
.Зарегистрируйте один и тот же объект несколько раз с другой конфигурацией
Я рассматриваю использование ICommunicationClientProvider
в качестве обертки вокруг фактических клиентов. Он содержит список со всеми зарегистрированными клиентами и методы их извлечения. Я считаю, что это не лучший подход и, конечно, это «заставляет» меня трогать другие части приложения.
public class CommunicationClientProvider : ICommunicationClientProvider
{
public CommunicationClientCollection CommunicationClientsCollection { get; set; }
public string Tenant { get; set; }
public ICommunicationClient GetClients()
{
return CommunicationClientsCollection[Tenant];
}
public void SetClients(CommunicationClientCollection clients)
{
CommunicationClientsCollection = clients;
}
}
public interface ICommunicationClientProvider
{
ICommunicationClient GetClients();
void SetClients(CommunicationClientCollection clients);
}
Это для размещения коллекции
public class CommunicationClientCollection : Dictionary<string, ICommunicationClient>
{
}
Здесь я зарегистрировать коллекцию против SI
var clients = new CommunicationClientProvider();
foreach (var supportedTenant in supportedTenants)
{
clients.CommunicationClientsCollection
.Add(supportedTenant, new CommunicationClient(
new Uri(configuration.AppSettings["communication_api." + supportedTenant]),
new TenantClientConfiguration(supportedTenant)));
}
container.RegisterSingleton<ICommunicationClientProvider>(clients);
Вы знаете лучший способ сделать это? Это обычный сценарий, например, когда у вас несколько баз данных.
UPDATE: - ITenantContext часть - Это в основном, как мой жилец контекст выглядит интерфейс:
public interface ITenantContext
{
string Tenant { get; set; }
}
и это, где я делаю мой вызов API связи:
public class MoveRequestedHandler : IHandlerAsync<MoveRequested>
{
private readonly IJctConfigurationService _communicationClient;
private readonly ITenantContext _tenantContext;
public MoveRequestedHandler(IJctConfigurationService communicationClient, ITenantContext tenantContext)
{
_communicationClient = communicationClient;
_tenantContext = tenantContext;
}
public async Task<bool> Handle(MoveRequested message)
{
_tenantContext.Tenant = message.Tenant;
_communicationClient.ChangeApn(message.Imei, true);
return await Task.FromResult(true);
}
}
здесь регистрирую ITenantContext
container.RegisterSingleton<ITenantContext, TenantContext>();
Арендатор определяется в пределах объекта MoveRequested
(message.Tenant
). Как я могу сообщить CommunicationClient об этом арендаторе?
Ваш вопрос в настоящее время слишком расплывчатый. Пожалуйста, покажите код с вашим вопросом. – Steven
Я обновил потенциальное решение, дайте мне знать, если требуется более подробная информация. – Rober