我有两个控制器:
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) { }
}
发布于 2018-10-24 03:22:58
使用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())));
}
通过在调用AddControllersAsServices
之后重新注册V1.SomeController
和V2.SomeController
,您可以准确地控制它们是如何构造的,传递一个IProvider
实现,该实现为每个控制器配置了所需的IStorage
实现。
Andrew Lock在Controller activation and dependency injection in ASP.NET Core MVC中描述了这种方法。
https://stackoverflow.com/questions/52954321
复制相似问题