gpt4 book ai didi

c# - DI : Different implementations of the same interface for the different controllers

转载 作者:太空宇宙 更新时间:2023-11-03 22:39:47 24 4
gpt4 key购买 nike

我有两个 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) { }
}

对于 Controller 的第一个版本,我需要使用 V1Storage,对于第二个版本 - V2Storage。我知道有一种方法可以替换 DefaultControllerFactory 但实现它的最佳方法是什么?

最佳答案

使用AddControllersAsServices帮助解决这个问题。该文档描述了这一点:

Registers discovered controllers as services in the 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.SomeControllerV2.SomeController,您可以准确控制它们的构造方式,传入一个 IProvider 实现,为每个 Controller 配置了所需的 IStorage 实现。

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

关于c# - DI : Different implementations of the same interface for the different controllers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52954321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com