我的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;
有人能告诉我在这里可能需要做什么吗?
在创建作用域并将其传递给Client
构造函数之前,您必须注册Client
正在从ILifetimeScope
解析的所有依赖项。
例如,如果Client
正在解析IService
依赖项,则可以创建该依赖项的mock并将其注册到容器中:
var serviceMock = new Mock<IService>();
containerBuilder.RegisterInstance(serviceMock.Object);
var container = containerBuilder.Build();
var lifetimeScope = container.BeginLifetimeScope();
然后可以将lifetimeScope
实例传递给Client
构造函数。
本例假设您正在使用moq来模拟您的服务。通常不需要将KEY
传递给BeginLifetimeScope
方法。
然而,根据ILifetimeScope
在Client
中的使用方式,构建容器可能会更加复杂。通常不鼓励直接注入ILifetimeScope
,而是应该注入所需的服务。有很多方法可以注入更复杂的服务,因此通常不需要注入ILifetimeScope
(请参见命名和键控服务、委派工厂和拥有的实例(。
AutoMock可能也值得一看,它简化了创建具有大量依赖关系的对象,因为您不必单独模拟每个依赖关系。