C# DI:不同控制器相同接口的不同实现

C# DI:不同控制器相同接口的不同实现,c#,asp.net,asp.net-core,C#,Asp.net,Asp.net Core,我有两个控制器: namespace V1 { [ApiVersion("1.0")] public class SomeController : Controller { public SomeController(IProvider provider) { } } } namespace V2 { [ApiVersion("2.0")] public class SomeController : Controller

我有两个控制器:

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) { }
}
对于第一个版本的控制器,我需要使用
v1存储
,对于第二个版本-
v2存储
。我知道有一种方法可以取代
DefaultControllerFactory
,但实现它的最佳方法是什么?

请使用以帮助解决此问题。文件中描述了这一点:

将发现的控制器注册为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
,您可以准确地控制它们的构造方式,为每个控制器传递一个配置了所需
IStorage
实现的
IProvider
实现

Andrew Lock在中描述了这种方法