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

本文关键字:WCF 管理 情况下 服务 范围 周期 生命 ILifetimeScope | 更新日期: 2023-09-27 18:02:26

这是我与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();
    }
}

我知道ILifetimeScopeIContainer可以在MyService中实现,但我想保持所有容器工作在组成根。

请帮我满足这个要求。这是我当前的注册:

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

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

InstancePerLifetimeScope应该可以工作,但是您必须在您的特定场景中进行测试。

由于WCF内部的限制,在WCF中没有每个请求的生命周期。请参阅文档顶部的粗体注释。WCF在其DI集成点方面非常有限。

Autofac为服务的每个实例创建一个实例上下文。该上下文包含从其解析服务实例的生存期范围。作用域没有命名,因为对于单例服务,实例上下文在服务的生命周期内存在——这是由WCF控制的,而不是由Autofac控制的。

因此,假设如果您在WCF中为每个请求创建服务实例并将依赖项注册为每个生命周期范围的实例,则应该得到您想要的结果。但是,一如既往,测试,测试,测试。有时,使用正确的autofacc生命周期注册获得正确的WCF设置可能会很棘手,特别是在复杂的系统中。