我有两个控制器:
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
的方法,但是实现它的最佳方法是什么?
答案 0 :(得分:3)
您可以使用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
实现。
安德鲁·洛克(Andrew Lock)在他的博客文章Controller activation and dependency injection in ASP.NET Core MVC中描述了这种方法。