我在我的IoC容器中注册了这个api客户端ICommunicationClient(url, tenant)
。现在我正面临着我可以拥有 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);
你知道更好的方法吗?这是正常情况,例如,当您有多个数据库时。
更新: - 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知道该租户?