【问题标题】:Context-based dependency resolution in autofacautofac 中基于上下文的依赖解析
【发布时间】:2015-07-30 22:40:00
【问题描述】:

考虑由几个 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 方法上将该服务注册为“每个依赖项”。没什么有趣的。但是现在我希望 IDependency 根据上下文返回不同的数据:

  • 网络表单->“
  • 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 魔法可以做到这一点?如果我能这样写就太好了:

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

【问题讨论】:

  • 那么您让 MVC Web API 和 WCF 在同一个应用程序域中运行?这可能是你烦恼的根源吗?
  • 或者至少,如果你给每个技术栈一个自己的容器实例,这个问题已经很容易解决了。
  • 是的,它们都在同一个 WP 中运行,只要我不依赖于“技术”特定功能(例如用于单元测试的 HttpContext、OperationContext 或 TestContext)就可以了。所以问题是关于如何使用 autofac 来区分这种特定于技术的功能。
  • 你是对的,但错了 =) 我可以将“应用程序”的某些部分实现为 mvc 视图,但是如果应用程序的另一部分(模块、插件等)适合 SPA,那么我需要 webapi /wcf 来支持它。而且 autofac 已经完美地支持了所有这些“上下文”。

标签: c# dependencies autofac


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多