c# - DI:不同控制器对同一接口的不同实现
问题描述
我有两个控制器:
namespace V1
{
[ApiVersion("1.0")]
public class SomeController : Controller
{
public SomeController(IProvider provider) { }
}
}
namespace V2
{
[ApiVersion("2.0")]
public class SomeController : Controller
{
public SomeController(IProvider provider) { }
}
}
以及以下服务:
public interface IStorage { }
public interface IProvider { }
public class V1Storage : IStorage { }
public class V2Storage : IStorage { }
public class Provider : IProvider
{
public Provider(IStorage storage) { }
}
对于我需要使用的第一个版本的控制器V1Storage
,对于第二个 - V2Storage
. 我知道有一种方法可以替换DefaultControllerFactory
,但最好的方法是什么?
解决方案
使用AddControllersAsServices来帮助解决这个问题。该文档描述了这一点:
将发现的控制器注册为 IServiceCollection 中的服务。
这是一个完整的例子:
void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddControllersAsServices();
services.AddTransient(sp => new V1.SomeController(new Provider(new V1Storage())));
services.AddTransient(sp => new V2.SomeController(new Provider(new V2Storage())));
}
通过重新注册V1.SomeController
并V2.SomeController
在调用 之后AddControllersAsServices
,您可以准确控制它们的构造方式,并传入一个为每个控制器IProvider
配置了所需实现的实现。IStorage
Andrew Lock在 ASP.NET Core MVC 中的控制器激活和依赖注入中描述了这种方法。
推荐阅读
- google-coral - Coral SoM 上的 J1301 和 J1302 外部天线连接器
- java - xxx 的不可解析父 POM
- wordpress - 当我用于密码检索消息时,retrieve_password_message 不起作用
- python - 为什么 scipy 的 splrep 在输入数据上显示错误?
- c# - System.ArgumentException:ORA-22062:输入字符串无效 [161.252.2.150]
- jsf - 如何在jsf中使用selectOneMenu,对象的值不是String?
- c# - 将 OpenGL 4.5 代码降级到 OpenGL 3.0
- javascript - 如何使用reduce删除对象数组中的空值?
- android - 在同一应用程序(Android)中为移动/桌面和电视上传多个 APK。Google Play 开发者控制台无法正常工作
- .net - 将 utc 格式 DateTime 字符串转换为日期时间时出现异常