这是我与Autofac.Wcf集成的简单WCF服务:
[ServiceContract]
public class MyService
{
private readonly IResponseBuilder _responseBuilder;
private readonly IEnumerable<IOperation> _operations;
public MyService(IResponseBuilder responseBuilder, IEnumerable<IOperation> operations)
{
_responseBuilder = responseBuilder;
_operations = operations;
}
[OperationContract]
public object Execute()
{
foreach (var operation in _operations)
{
operation.Execute();
}
return _responseBuilder.Build();
}
}
我希望所有操作都使用IResponseBuilder
的相同实例来构建结果。操作示例:
public class AlwaysFailOperation : IOperation
{
private readonly IOperationResultBuilder _resultBuilder;
public AlwaysFailOperation(IOperationResultBuilder resultBuilder)
{
_resultBuilder = resultBuilder;
}
public void Execute()
{
_resultBuilder.Fail();
}
}
我知道可以通过ILifetimeScope
内的IContainer
或MyService
来实现,但我希望将所有容器保留在组合根目录中。
请帮我解决这个问题。这是我目前的注册:
public static void AppInitialize()
{
var builder = new ContainerBuilder();
builder.RegisterType<MyService>();
builder.RegisterType<ResponseBuilder>()
.AsImplementedInterfaces();
builder.RegisterType<AlwaysFailOperation>()
.AsImplementedInterfaces();
AutofacHostFactory.Container = builder.Build();
}
答案 0 :(得分:3)
InstancePerLifetimeScope
应该有效,但您必须在特定情况下对其进行测试。
由于WCF内部的限制,WCF中没有每个请求生存期。 See the bold comment at top of docs. WCF对其DI集成点非常有限。
Autofac为每个服务实例创建一个实例上下文。该上下文包含解析服务实例的生命周期范围。范围未命名,因为对于单例服务,实例上下文在服务的生命周期中存在 - 由WCF控制,而不是Autofac。
因此,假设如果您在WCF中为每个请求创建了服务实例,并将依赖项注册为每个生命周期范围的实例,那么您应该获得所需的结果。但是,一如既往,测试,测试,测试。有时,使用正确的Autofac生命周期注册获得正确的WCF设置可能会非常棘手,尤其是在复杂的系统中。