这是我的简单 WCF 服务,它与 Autofac.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();
}
}
我知道它可以通过 MyService
内的 ILifetimeScope
或 IContainer
来实现,但我想将所有容器工作保留在组合根中。
请帮我满足这个要求。这是我当前的注册:
public static void AppInitialize()
{
var builder = new ContainerBuilder();
builder.RegisterType<MyService>();
builder.RegisterType<ResponseBuilder>()
.AsImplementedInterfaces();
builder.RegisterType<AlwaysFailOperation>()
.AsImplementedInterfaces();
AutofacHostFactory.Container = builder.Build();
}
最佳答案
InstancePerLifetimeScope
应该可以工作,但您必须在特定场景中对其进行测试。
由于 WCF 内部的限制,WCF 中没有每个请求的生命周期。 See the bold comment at top of docs. WCF 的 DI 集成点非常有限。
Autofac 为服务的每个实例创建一个实例上下文。该上下文包含解析服务实例的生命周期范围。范围未命名,因为对于单例服务,实例上下文在服务的生命周期内存在 - 由 WCF 控制,而不是 Autofac。
因此,假设,如果您在 WCF 中为每个请求创建了服务实例,并将依赖项注册为每个生命周期范围的实例,您应该会得到您想要的结果。但是,一如既往,测试,测试,测试。有时,通过正确的 Autofac 生命周期注册来获得正确的 WCF 设置可能很棘手,尤其是在复杂的系统中。
关于c# - 如何在不直接使用 ILifetimeScope 的情况下管理 WCF 服务内部的生命周期范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38945527/