首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >DI:同一接口的不同实现用于不同的控制器

DI:同一接口的不同实现用于不同的控制器
EN

Stack Overflow用户
提问于 2018-10-24 01:01:46
回答 1查看 155关注 0票数 1

我有两个控制器:

代码语言:javascript
复制
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) { }
    }
}

以及以下服务:

代码语言:javascript
复制
public interface IStorage { }
public interface IProvider { }
public class V1Storage : IStorage { }
public class V2Storage : IStorage { }
public class Provider : IProvider
{
    public Provider(IStorage storage) { }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-24 03:22:58

使用AddControllersAsServices来帮助实现这一点。文档描述了这一点:

在IServiceCollection中将发现的控制器注册为服务。

下面是一个完整的示例:

代码语言:javascript
复制
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.SomeControllerV2.SomeController,您可以准确地控制它们是如何构造的,传递一个IProvider实现,该实现为每个控制器配置了所需的IStorage实现。

Andrew Lock在Controller activation and dependency injection in ASP.NET Core MVC中描述了这种方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52954321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档