Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# autofac中基于上下文的依赖关系解析_C#_Dependencies_Autofac - Fatal编程技术网

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

C# autofac中基于上下文的依赖关系解析,c#,dependencies,autofac,C#,Dependencies,Autofac,考虑“混合”应用程序,它由两个asp.net web表单、几个asp.net mvc控制器、一堆web.api控制器、一些支持web的wcf服务和单元测试组成。这些都是接受请求的“输入点”。现在考虑每一个“输入类型”,我有一个调用链,结束了下面的“服务”调用方法: class SomeService: IService // not Wcf or Web service, just BL { private readonly IDependency1 dependency1; p

考虑“混合”应用程序,它由两个asp.net web表单、几个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();
}
我在应用程序启动方法上注册此服务一次,注册为“按依赖项”。没什么有趣的。但是现在我希望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);
    }
公共静态请求上下文检测上下文()
{
if(null!=OperationContext.Current)
{
返回RequestContext.Wcf;
}
...
}
建筑商登记(
c=>
{
var context=DetectContext();
返回c.resolvedkeyed(上下文);
}
有任何autofac magic可以做到这一点吗?如果我能像这样编写smth,那就太好了:

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

关于这类事情,Autofac网站上有一个完整的FAQ,其中包含详细的示例和选项:

关于这类事情,Autofac网站上有一个完整的FAQ,其中包含详细的示例和选项:

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