比如这样一个控制器:
public class AntiAdController : Controller
{
private readonly ICheckService _checkService;
public AntiAdController(ICheckService checkService)
{
_checkService = checkService;
}
}
Startup 中已经给 ICheckService 接口注册了一个默认实现,请问如何单独给这个 Controller 注册另外一个 ICheckService 的实现?
services.addxontrollerassercice().addscope(adtiadcontroller,sp=>new adtiadcontroller(sp.getservice<mychecksercice>))
试试看,类似的code,应该可以
最终采用的解决方法如下:
1)新增一个 IAdCheckService
接口继承 ICheckService
接口
public interface IAdCheckService : ICheckService
{
}
2)类 AdCheckService
实现 IAdCheckService
接口并实现 ICheckService
接口的 Check
方法
public class AdCheckService : IAdCheckService
{
public async Task<CheckStatus> Check(Checkee checkee)
{
//...
}
}
3)Startup 中注册
services.AddTransient<IAdCheckService, AdCheckService>();
4)AntiAdController 只需将构造函数的参数类型改为 IAdCheckService
,其他都不变。
public class AntiAdController : Controller
{
private readonly ICheckService _checkService;
public AntiAdController(IAdCheckService checkService)
{
_checkService = checkService;
}
}
这个方法好,不会对原有的实现造成干扰。
找到一个基于 Autofac 的解决方法,详见 https://stackoverflow.com/a/48308516/5989202
– dudu 5年前基于 Lamar 的解决方法见 ASP.NET Core with Lamar : Solving the “single interface — multiple implementations” dependency injection problem
– dudu 5年前