动态确定 Structuremap 依赖关系
Dynamically determine Structuremap dependency
我有一个服务接口 IService,它有多个实现,可以从不同的数据源检索数据。在我的 WebApi 控制器中,我希望在运行时根据自定义操作过滤器在 BaseApiController 中设置的布尔标志来解决此依赖关系:
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 容器,以便它检查基本控制器中的条件,并相应地创建 IService 的具体实现。
我正在寻找某种可以在运行时计算的 lambda。我试过 ConditionalUse(),但感觉这不是正确的方法,因为它似乎是在构建容器时调用的,而不是在运行时调用的。
您可以使用允许您指定工厂方法的 Use
重载。例如。在注册表中:
bool isTest = true;
For<IServiceProvider>().Use(
ctx => isTest ? (IServiceProvider)ctx.GetInstance<Foo>() :
ctx.GetInstance<Bar>())
如果您有多个实现,您还可以考虑使用两个不同的注册表并使用 IncludeRegistry
来确定在运行时使用哪个。
我有一个服务接口 IService,它有多个实现,可以从不同的数据源检索数据。在我的 WebApi 控制器中,我希望在运行时根据自定义操作过滤器在 BaseApiController 中设置的布尔标志来解决此依赖关系:
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 容器,以便它检查基本控制器中的条件,并相应地创建 IService 的具体实现。
我正在寻找某种可以在运行时计算的 lambda。我试过 ConditionalUse(),但感觉这不是正确的方法,因为它似乎是在构建容器时调用的,而不是在运行时调用的。
您可以使用允许您指定工厂方法的 Use
重载。例如。在注册表中:
bool isTest = true;
For<IServiceProvider>().Use(
ctx => isTest ? (IServiceProvider)ctx.GetInstance<Foo>() :
ctx.GetInstance<Bar>())
如果您有多个实现,您还可以考虑使用两个不同的注册表并使用 IncludeRegistry
来确定在运行时使用哪个。