首页 > 解决方案 > 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,但最好的方法是什么?

标签: c#asp.netasp.net-core

解决方案


使用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.SomeControllerV2.SomeController在调用 之后AddControllersAsServices,您可以准确控制它们的构造方式,并传入一个为每个控制器IProvider配置了所需实现的实现。IStorage

Andrew Lock在 ASP.NET Core MVC 中的控制器激活和依赖注入中描述了这种方法。


推荐阅读