autofac中基于上下文的依赖关系解析

时间:2015-07-29 11:32:32

标签: c# dependencies autofac

考虑'混合'应用程序,它包含几个asp.net web-form,几个asp.net mvc控制器,一把web.api控制器,一些支持web的wcf服务和一些单元测试。这些都是接受请求的“输入点”。现在考虑每个'输入类型'我有一个调用链结束调用以下'服务'的方法:

class SomeService: IService // not Wcf or Web service, just BL
{
    private readonly IDependency1 dependency1;
    public SomeService(IDependency1 dependency1)
    {
        this.dependency1 = dependency1;
    }
    private Anything DoSomething()
    {
        var result1 = this.dependecy1.GetSomeData();
        return DoSomeFancyCalculations(result1);
    }
}

public interface IDependency1
{
    string GetSomeData();
}

我在Application_Start方法上将此服务注册为“per-dependency”。没什么有趣的。但是现在我希望IDependency根据上下文返回不同的数据:

  • webform - > “< asp:Net_WebForm />”
  • mvc - > '@ {asp.net =“mvc”}'
  • webapi - > “ipabew”
  • wcf - > '{d:'wcf'}'
  • 单元测试 - > 'Assert.False(“我没有经过测试”)'

对于单元测试,我可以单独进行单一注册,但对于其他情况,应该自动进行分解。我只能考虑使用键控服务和其他工厂来检测当前上下文并使用适当的密钥解决依赖关系:

public static RequestContext DetectContext()
{
     if (null != OperationContext.Current)
     {
          return RequestContext.Wcf;
     }
     ...
}

builder.Register(
    c =>
    {
        var context = DetectContext();
        return c.ResolveKeyed<IDependency1>(context);
    }

有没有可以做到这一点的autofac魔法?如果我能像这样写smth会很好:

builder
    .RegisterType<WebFormDependency>()
    .As<IDependency1>()
    .ForWebForms()

1 个答案:

答案 0 :(得分:0)

有一个完整的常见问题解答,其中包含Autofac网站上有关此类事情的详细示例和选项:How do I pick a service implementation by context?