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

标签 c# wcf autofac

这是我的简单 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 内的 ILifetimeScopeIContainer 来实现,但我想将所有容器工作保留在组合根中。

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

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/

相关文章:

asp.net - SignalR + Autofac + OWIN : Why doesn't GlobalHost. ConnectionManager.GetHubContext 工作?

c# - 如何使用Autofac在非引用项目中注册组件

C# - 检查属性是否存在于枚举的元素上

c# - WCF 服务可以替代 TCPListener 的功能吗?

wcf - 是否有替代 HTTPS 的方法来保护网站?

c# - DataContractAttribute 基础知识

asp.net-core - ASP.NET Core 中的 Autofac 范围似乎在中间件之间有所不同

c# - 如何使用 ASP.NET Core 验证 Web 请求的 SSL 证书

c# - 序列化 Protobuf 对象并使用 ØMQ/ZMQ 发送

c# - 从 Azure 表存储获取 1000 多个数据集