C# Autofac中的装饰器和属性注入

C# Autofac中的装饰器和属性注入,c#,autofac,C#,Autofac,我正在尝试为这些使用属性注入的服务注册decorator。 当我添加containerBuilder.RegisterDecorator()时,属性不再被注入。 我猜Autofac正试图将其注入到装饰程序中,而不是原始服务 我已经编写了一些测试来展示这个问题。有服务和装饰师: 公共接口iSeries设备 { bool NestedServiceIsNotNull(); } 公共接口INestedService{} 公共课服务:IService { 公共INestedService嵌套服务{get

我正在尝试为这些使用属性注入的服务注册decorator。
当我添加
containerBuilder.RegisterDecorator()
时,属性不再被注入。
我猜Autofac正试图将其注入到装饰程序中,而不是原始服务

我已经编写了一些测试来展示这个问题。有服务和装饰师:

公共接口iSeries设备
{
bool NestedServiceIsNotNull();
}
公共接口INestedService{}
公共课服务:IService
{
公共INestedService嵌套服务{get;set;}
公共bool NestedServiceIsNotNull()
{
返回NestedService!=null;
}
}
公共类NestedService:INestedService{}
公共类ServiceDecorator:IService
{
私人只读设备(原件);
公共服务装饰师(IService原件)
{
_原件=原件;
}
公共bool NestedServiceIsNotNull()
{
返回_original.NestedServiceIsNotNull();
}
}
以及测试方法:

[TestMethod]
公共无效属性InjectedServiceShouldbenull()
{
var builder=new ContainerBuilder();
builder.RegisterType().As();
builder.RegisterType().As().PropertiesAutowired();
var container=builder.Build();
var service=container.Resolve();
Assert.IsTrue(service.NestedServiceIsNotNull());
}
[测试方法]
public void Property InjectedServices不应完全均匀地进行装饰或注册()
{
var builder=new ContainerBuilder();
builder.RegisterType().As();
builder.RegisterType().As().PropertiesAutowired();
//这里是区别-装饰服务
//导致断言失败。
builder.RegisterDecorator();
var container=builder.Build();
var service=container.Resolve();
Assert.IsTrue(service.NestedServiceIsNotNull());
}
第一个测试通过,但第二个测试因断言而失败

这是正确的行为吗?
我正在处理一个遗留项目,因此我不应该通过将依赖项移动到构造函数来更改现有代码。

有没有办法解决这个问题

看来。。。你发现了一只虫子!哟

然而,一切都没有丢失-您仍然可以按您想要的方式使用装饰器,您只需使用较旧的不太漂亮的Autofac装饰器语法即可完成

var builder=newcontainerbuilder();
builder.RegisterType().As();
//用旧语法装饰服务是可行的。
builder.RegisterType().Named(“服务”).PropertiesAutowired();
builder.RegisterDecorator((c,内部)=>newServiceDecorator(内部),fromKey:“服务”);
var container=builder.Build();
var service=container.Resolve();
Assert.True(service.NestedServiceIsNotNull());

为了吸引更多的人加入,我可能会推荐几件事:首先,将代码正确地放在问题中是一种很好的做法。很少有人会关注链接并深入研究GitHub回购协议,即使它很简单。(如果把代码放在问题中太难了,也许它需要简化?)第二,我确实看到您的测试被“重构”,以具有可选的
customConfiguration
参数和单独的容器构建方法。为了清晰起见,考虑解开,这样测试是独立的,人们不必手动跟踪。