【问题标题】:Dependency injection @ Runtime依赖注入@运行时
【发布时间】:2019-05-29 07:52:35
【问题描述】:

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

在数据库中,每个客户都有几个数据仓库。 是否可以在不创建新实例@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 

    }
   }

【问题讨论】:

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


    【解决方案1】:

    您可以注册和注入工厂委托Func&lt;string, DataWareHouseService&gt;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);
    }
    

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

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

    【讨论】:

    • 感谢你的好例子。我会检查这是否适用于我的问题。
    • dwsService的构造函数中需要EntityConnectionString。我只有 1 项服务可用于不同的连接。如果我为每个客户提供不同的 DatawarehouseService,上面的示例只会解决问题。
    • @FrederikDeClercq 您想为每个客户提供单例 DatawarehouseService 吗?
    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2010-11-29
    • 2021-11-19
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    相关资源
    最近更新 更多