依赖注入@运行时

时间:2019-05-29 07:52:35

标签: asp.net api model-view-controller autofac

我有一个看起来很简单的控制器,如下所示。 我想对我的所有DataServices使用依赖注入。

在数据库中,每个客户端都有多个数据仓库。 是否可以在不创建新实例@runtime的情况下注入DatawareHouseService? 我首先需要调用MainService以获得正确的连接字符串。

    protected internal IMainService mainService;
    public EventController(ITeamleaderMainService MainService)
   {
        this.mainService = MainService;
   }
    public async Task<HttpResponseMessage> Post([FromBody]JObject Value)
   {
    var companySettings = await mainService .GetCompanySettingsByGroup(Value["Account_Id"].ToObject<int>());

    using (DataWareHouseService dwSService = new DataWareHouseService(companySettings.EntityConnectionstring()))
    {
       //Do some stuff 

    }
   }

1 个答案:

答案 0 :(得分:0)

您可以注册并注入工厂代表Func<string, DataWareHouseService>Here,您可以看到一个示例。

using (var dwSService = _dwhClientFactory.Invoke(companySettings.EntityConnectionstring()))
{
   //Do some stuff
}

如果您希望每个客户端只有一个实例,则可以创建DwhClientResolver类,如下所示:

public class DwhClientResolver : IDwhClientResolver 
{
    private readonly ConcurrentDictionary<string, Lazy<DataWareHouseService>> _instances = 
        new ConcurrentDictionary<string, Lazy<DataWareHouseService>>();

    public DataWareHouseService GetClient(string connStr) => 
        _instances.GetOrAdd(connStr, x => new Lazy<DataWareHouseService>(() => new DataWareHouseService(x))).Value;
}

public interface IDwhClientResolver
{
    DataWareHouseService GetClient(string connStr);
}

,将其注册为单例,并在需要IDwhClientResolver的所有位置注入DataWareHouseService

您还可以检查keyed-services的方法,但是DwhClientResolver的使用更为简单。