C# Autofac容器更新和模拟依赖项
作为集成测试的一部分,我想用Autofac包装一个已注册的类,以便跟踪该类上发生的事情,并将操作重定向到原始实现 在下面的示例中,我创建了第一个容器,其中包含真实的应用程序容器,然后创建了一个spyContainer spyContainer应重复使用C# Autofac容器更新和模拟依赖项,c#,design-patterns,dependency-injection,autofac,C#,Design Patterns,Dependency Injection,Autofac,作为集成测试的一部分,我想用Autofac包装一个已注册的类,以便跟踪该类上发生的事情,并将操作重定向到原始实现 在下面的示例中,我创建了第一个容器,其中包含真实的应用程序容器,然后创建了一个spyContainer spyContainer应重复使用NameRetriever的registeredInstance以及WorldLogger,但WorldLogger应注入一个HelloLoggerSpy,其本身应与原始IHelloLogger实例化 公共类名称检索器 { 公共字符串GetName
NameRetriever
的registeredInstance以及WorldLogger
,但WorldLogger
应注入一个HelloLoggerSpy
,其本身应与原始IHelloLogger
实例化
公共类名称检索器
{
公共字符串GetName()
{
返回“linvi”;
}
}
公共接口iHellogger
{
void Hello();
}
公共类HelloLogger:IHelloLogger
{
私有只读名称检索器\u名称检索器;
公共HelloLogger(名称检索器名称检索器)
{
_nameRetriever=nameRetriever;
}
公共空间
{
WriteLine(“Hello”+_nameRetriever.GetName());
}
}
公共类世界记录者
{
私人只读iHellogger\u Hellogger;
公共世界记录者(iHellogger Hellogger)
{
_helloLogger=helloLogger;
}
公共空间世界()
{
_你好;
Console.WriteLine(“欢迎来到这个世界”);
}
}
公共类HelloLogger间谍:IHelloLogger
{
私有只读iHellogger\u sourceHellogger;
公共布尔称为{get;private set;}
公共HelloLogger Spy(IHelloLogger源HelloLogger)
{
_sourceHelloLogger=sourceHelloLogger;
}
公共空间
{
_sourceHelloLogger.Hello();
调用=真;
}
}
静态void Main()
{
var containerBuilder=新的containerBuilder();
//这是正常的容器创建
RegisterInstance(新名称检索器());
containerBuilder.RegisterType().As();
containerBuilder.RegisterType();
var realContainer=containerBuilder.Build();
//这是在测试期间可以调用的东西
//凌驾于行为之上
containerBuilder.Register(上下文=>
{
var realA=context.Resolve();//递归,因为IA尚未重用上一个
var aSpy=新HelloLoggerSpy(realA);
返回肉冻;
});
var spyContainer=containerBuilder.Build();//无法生成两次
var b=spyContainer.Resolve();
b、 World();//应该调用HelloLoggerSpy.Hello()
}
任何人都知道如何在这里实现这一点,以及将来如何实现这一点?它看起来像是
HelloLoggerSpy
的行为类似于装饰器模式,并且Autofac对这种模式具有本机支持
您可以使用以下选项,而不是自定义注册HelloLoggerSpy
:
builder.RegisterDecorator<HelloLoggerSpy, IHelloLogger>();`
builder.RegisterDecorator();`
有关更多信息,请参阅Autofac文档中的
你不能多次构建一个容器,但你可以创建一个childlifetime作用域,并在这个新东西上注册东西
using(var scope = realContainer.BeginLifetimeScope(b => {
b.RegisterDecorator<HelloLoggerSpy, IHelloLogger>();
}))
{
scope.Resolve<IHelloLogger>(); // => HelloLoggerSpy
}
使用(var scope=realContainer.BeginLifetimeScope)(b=>{
b、 RegisterDecorator();
}))
{
scope.Resolve();//=>HelloLoggerSpy
}
非常感谢您的回答,我不知道这种自动传真模式。