Инъекция зависимости @ Runtime - PullRequest
0 голосов
/ 29 мая 2019

У меня есть контроллер, который выглядит просто как показано ниже. Я хочу использовать внедрение зависимостей для всех моих DataServices.

В базе данных у меня есть несколько хранилищ данных для каждого Клиента. Можно ли внедрить мой DatawareHouseService без создания нового экземпляра @runtime? Сначала мне нужно вызвать 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 голосов
/ 29 мая 2019

Вы можете зарегистрироваться и ввести фабричный делегат Func<string, DataWareHouseService>. Здесь вы можете увидеть пример.

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 проще.

...