我有一个看起来很简单的控制器,如下所示。 我想对我的所有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
}
}
答案 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
的使用更为简单。