C# Autofac容器更新和模拟依赖项

C# Autofac容器更新和模拟依赖项,c#,design-patterns,dependency-injection,autofac,C#,Design Patterns,Dependency Injection,Autofac,作为集成测试的一部分,我想用Autofac包装一个已注册的类,以便跟踪该类上发生的事情,并将操作重定向到原始实现 在下面的示例中,我创建了第一个容器,其中包含真实的应用程序容器,然后创建了一个spyContainer spyContainer应重复使用NameRetriever的registeredInstance以及WorldLogger,但WorldLogger应注入一个HelloLoggerSpy,其本身应与原始IHelloLogger实例化 公共类名称检索器 { 公共字符串GetName

作为集成测试的一部分,我想用Autofac包装一个已注册的类,以便跟踪该类上发生的事情,并将操作重定向到原始实现

在下面的示例中,我创建了第一个容器,其中包含真实的应用程序容器,然后创建了一个spyContainer

spyContainer应重复使用
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
}

非常感谢您的回答,我不知道这种自动传真模式。