【问题标题】:Not sure if I'm creating a correct lifetime scope不确定我是否正在创建正确的生命周期范围
【发布时间】:2021-06-07 08:43:20
【问题描述】:

我的 Specflow 步骤之一是尝试使用将 Autofac 的 ILifetimeScope 作为参数的方法。这是该步骤试图调用的方法:

public Client(string clientAddress, ILogger<Client> logger, IFieldDict fieldDict, IdGenerator idGenerator, ILifetimeScope scope);

我没有在我的 Specflow 应用程序中使用 Autofac,所以我不确定我是否正确地创建了 ILifetimeScope

我将此添加到我的构造函数中,但不确定这是否正确,但我的客户端实例似乎没有正确创建。

var containerBuilder = new ContainerBuilder();
container = (Container)containerBuilder.Build();
var lifetimeScope = container.BeginLifetimeScope("KEY");
_iLifetimeScope = lifetimeScope;

谁能建议我在这里可能需要做什么?

【问题讨论】:

    标签: c# .net autofac specflow lifetime-scoping


    【解决方案1】:

    在创建作用域并将其传递给Client 构造函数之前,您必须注册ClientILifetimeScope 解析的所有依赖项。

    例如,如果 Client 正在解析 IService 依赖项,您可以创建此依赖项的模拟并将其注册到容器中:

    var serviceMock = new Mock<IService>();
    containerBuilder.RegisterInstance(serviceMock.Object);
    
    var container = containerBuilder.Build();
    var lifetimeScope = container.BeginLifetimeScope();
    

    然后您可以将lifetimeScope 实例传递给Client 构造函数。

    本示例假设您使用moq 模拟您的服务。通常不需要将KEY 传递给BeginLifetimeScope 方法。

    但是,根据ILifetimeScopeClient 中的使用方式,构建容器可能会更加复杂。通常不鼓励直接注入ILifetimeScope,而是应该注入所需的服务。有很多方法可以注入更复杂的服务,因此通常不需要注入ILifetimeScope(参见Named and Keyed ServicesDelegate FactoriesOwned Instances)。

    AutoMock 也值得一看,它简化了创建具有大量依赖项的对象,因为您不必单独模拟每个依赖项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2018-07-10
      • 2023-03-27
      • 2012-12-19
      • 2012-06-16
      相关资源
      最近更新 更多