0

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

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;

有人可以建议我在这里可能需要做什么吗?

4

1 回答 1

0

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

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

var serviceMock = new Mock<IService>();
containerBuilder.RegisterInstance(serviceMock.Object);

var container = containerBuilder.Build();
var lifetimeScope = container.BeginLifetimeScope();

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

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

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

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

于 2021-06-07T09:16:31.223 回答