C# autofac中基于上下文的依赖关系解析
考虑“混合”应用程序,它由两个asp.net web表单、几个asp.net mvc控制器、一堆web.api控制器、一些支持web的wcf服务和单元测试组成。这些都是接受请求的“输入点”。现在考虑每一个“输入类型”,我有一个调用链,结束了下面的“服务”调用方法: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
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已经完全支持所有这些“上下文”。