autofacc中基于上下文的依赖项解析

本文关键字:依赖 上下文 autofacc | 更新日期: 2023-09-27 18:05:32

考虑由一对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'。没有什么有趣的。但是现在我想让dependency根据上下文返回不同的数据:

  • webform -> ""
  • mvc -> '@{asp.net = "mvc"}'
  • webapi -> "ipabew"
  • wcf -> '{d: 'wcf'}' '
  • 单元测试->"断言"。False("i was not testing ")'

对于单元测试,我可以单独进行单个注册,但对于其他上下文,应该自动做出决定。我只能想到使用键服务和额外的工厂来检测当前上下文,并使用适当的键来解决依赖关系:

public static RequestContext DetectContext()
{
     if (null != OperationContext.Current)
     {
          return RequestContext.Wcf;
     }
     ...
}
builder.Register(
    c =>
    {
        var context = DetectContext();
        return c.ResolveKeyed<IDependency1>(context);
    }

是否有任何自动魔术可以做到这一点?如果我能这样写就好了:

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

autofacc中基于上下文的依赖项解析

Autofac网站上有一个完整的FAQ,里面有关于这类事情的详细示例和选项:如何根据上下文选择服务实现?