动态确定结构依赖性



我有一个服务接口,即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。我已经尝试了pedricationaluse(),但是感觉不正确,因为在构建容器而不是在运行时似乎被调用。

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

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

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

最新更新