c# - 动态确定 Structuremap 依赖关系

标签 c# asp.net-web-api structuremap

我有一个服务接口(interface) IService,它有多个实现,可以从不同的数据源检索数据。在我的 WebApi Controller 中,我希望在运行时根据自定义操作过滤器在 BaseApiController 中设置的 bool 标志来解决此依赖关系:

public class BaseApiController : ApiController
{
    // Set during runtime by a custom action filter
    public bool Condition { get; set; }
}

public class MyController : BaseApiController
{
    private readonly IService _service;

    public MyController(IService service)
    {
        _service = service;
    }

我希望能够配置我的 StructureMap 容器,以便它检查基本 Controller 中的条件,并相应地创建 IService 的具体实现。

我正在寻找某种可以在运行时计算的 lambda。我试过 ConditionalUse(),但感觉这不是正确的方法,因为它似乎是在构建容器时调用的,而不是在运行时调用的。

最佳答案

您可以使用允许您指定工厂方法的 Use 重载。例如。在注册表中:

bool isTest = true;
For<IServiceProvider>().Use(
     ctx => isTest ? (IServiceProvider)ctx.GetInstance<Foo>() :
                     ctx.GetInstance<Bar>())

如果您有多个实现,您还可以考虑使用两个不同的注册表并使用 IncludeRegistry 来确定在运行时使用哪一个。

关于c# - 动态确定 Structuremap 依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30121991/

相关文章:

asp.net-web-api - 如何根据接受 header 使用 ASP.NET web mvc 6 返回 xml 或 json

c# - 结构图 - 同一接口(interface)的两个实现

c# - 如何将 Structuremap 3 与对构造函数注入(inject)不友好的对象一起使用?

c# - 在 StructureMap 中使用 Registry 创建可插拔架构

c# - 使用 MySql.Data.EntityFrameworkCore 包进行 TINYINT 或 BIT 类型映射时遇到问题

c# - 使用 PowerShell 在声明时初始化字典

c# - 如何将业务层映射到 UML 中的模型对象?

entity-framework - 如何针对与子列表一起使用的 Entity Framework 编写通用的 WebAPI Put 方法?

c# - VS 2017 中的 MySql 无法从数据库创建实体模型

c# - 我应该直接绑定(bind)到从网络服务返回的对象吗?