使用不同的配置

时间:2016-08-16 13:06:46

标签: c# simple-injector

我在我的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知道该租户?

0 个答案:

没有答案