首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >依赖注入@ Runtime

依赖注入@ Runtime
EN

Stack Overflow用户
提问于 2019-05-29 15:52:35
回答 1查看 40关注 0票数 0

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

在数据库中,我为每个客户端提供了几个数据仓库。是否可以在不创建新实例@ DatawareHouseService的情况下注入我的运行时?我首先需要调用MainService来获得正确的连接字符串。

代码语言:javascript
复制
    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 

    }
   }
EN

回答 1

Stack Overflow用户

发布于 2019-05-29 16:07:48

您可以注册和注入工厂委托Func<string, DataWareHouseService>Here你可以看到一个例子。

代码语言:javascript
复制
using (var dwSService = _dwhClientFactory.Invoke(companySettings.EntityConnectionstring()))
{
   //Do some stuff
}

如果你想让每个客户端都有一个实例,你可以创建DwhClientResolver类,如下所示:

代码语言:javascript
复制
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);
}

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

你也可以检查keyed-services的方法,但是DwhClientResolver的用法更简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56355571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档