【发布时间】:2018-12-22 08:31:01
【问题描述】:
我有一个 Address 对象,它依赖于构造函数中注入的 IState 对象:
public class AddressService : BaseService, IAddressService
{
private readonly IStateRepository _stateRepository;
private readonly ICacheClass _cache;
private readonly ILogger<AddressService> _logger;
public const string StatesCacheKey = "StateListManagedByStateService";
public AddressService(IStateRepository stateRepository,
ICacheClass cache,
ILogger<AddressService> logger,
IUserContext userContext) : base(userContext)
{
_stateRepository = stateRepository;
_cache = cache;
_logger = logger;
}
public async Task<IReadOnlyList<T>> GetAllStatesAsync<T>() where T : IState
{
var list = await _cache.GetAsync<IReadOnlyList<T>>(StatesCacheKey);
if (list != null) return list;
var repoList = _stateRepository.GetAll().Cast<T>().ToList();
_logger.LogInformation("GetAllStates retrieved from repository, not in cache.");
await _cache.SetAsync(StatesCacheKey, repoList);
return repoList;
}
}
IStateRepository 由 ASP.NET Core Web 项目注入,在 Startup 中具有以下几行:
services.AddTransient<IStateRepository, Local.StateRepository>();
services.AddTransient<IAddressService, AddressService>();
在我的控制器中,我有两种操作方法。根据调用的那个,我想更改与 DI 关联的 IStateRepository 对象:
private readonly IAddressService _addressService;
public HomeController(IConfiguration configuration, ILogger<HomeController> logger, IAddressService addressService) : base(configuration,logger)
{
_addressService = addressService;
}
public async Task<IActionResult> DistributedCacheAsync()
{
var services = new ServiceCollection();
services.Replace(ServiceDescriptor.Transient<IStateRepository, Repositories.Local.StateRepository>());
ViewBag.StateList = await _addressService.GetAllStatesAsync<State>();
return View();
}
public async Task<IActionResult> DapperAsync()
{
var services = new ServiceCollection();
services.Replace(ServiceDescriptor.Transient<IStateRepository, Repositories.Dapper.StateRepository>());
ViewBag.StateList = await _addressService.GetAllStatesAsync<State>();
return View();
}
问题是 _addressService 已经具有与 Startup 关联的 Local.StateRepository,并且在 DapperAsync 中使用 Replace 对其进行更新对其没有影响。
在上面的示例中,如何在运行时更改 DI 中的 IStateRepository?
【问题讨论】:
-
将它们作为 IEnumerable
注入,然后按类型选择您需要的那个?我只在手机上,所以无法提供示例:-/
标签: c# asp.net-core dependency-injection .net-core asp.net-core-mvc