DI:针对不同控制器的同一接口的不同实现

时间:2018-10-23 17:01:46

标签: 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
    {
        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的方法,但是实现它的最佳方法是什么?

1 个答案:

答案 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.SomeControllerAddControllersAsServices,您可以控制它们的确切结构,并传入配置了{每个控制器必需的IProvider实现。

安德鲁·洛克(Andrew Lock)在他的博客文章Controller activation and dependency injection in ASP.NET Core MVC中描述了这种方法。