如何在不直接使用ILifetimeScope的情况下管理WCF服务中的生命周期范围?

时间:2016-08-14 18:50:42

标签: c# wcf autofac

这是我与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内的IContainerMyService来实现,但我希望将所有容器保留在组合根目录中。

请帮我解决这个问题。这是我目前的注册:

public static void AppInitialize()
{
    var builder = new ContainerBuilder();
    builder.RegisterType<MyService>();
    builder.RegisterType<ResponseBuilder>()
        .AsImplementedInterfaces();
    builder.RegisterType<AlwaysFailOperation>()
        .AsImplementedInterfaces();
    AutofacHostFactory.Container = builder.Build();
}

1 个答案:

答案 0 :(得分:3)

InstancePerLifetimeScope应该有效,但您必须在特定情况下对其进行测试。

由于WCF内部的限制,WCF中没有每个请求生存期。 See the bold comment at top of docs. WCF对其DI集成点非常有限。

Autofac为每个服务实例创建一个实例上下文。该上下文包含解析服务实例的生命周期范围。范围未命名,因为对于单例服务,实例上下文在服务的生命周期中存在 - 由WCF控制,而不是Autofac。

因此,假设如果您在WCF中为每个请求创建了服务实例,并将依赖项注册为每个生命周期范围的实例,那么您应该获得所需的结果。但是,一如既往,测试,测试,测试。有时,使用正确的Autofac生命周期注册获得正确的WCF设置可能会非常棘手,尤其是在复杂的系统中。