Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Autofac通用装饰器正在复制组件_C#_Dependency Injection_Inversion Of Control_Decorator_Autofac - Fatal编程技术网

C# Autofac通用装饰器正在复制组件

C# Autofac通用装饰器正在复制组件,c#,dependency-injection,inversion-of-control,decorator,autofac,C#,Dependency Injection,Inversion Of Control,Decorator,Autofac,我发现了我认为可能是Autofac中的一个bug,但我想看看是否有人有一个可能的解决方案或解决方法,这样我就可以让它工作 基本上,我已经建立了一个通用的装饰,这工作得很好。问题是,只要我使用配置委托调用BeginLifetimeScope(),它就会错误地解析相同类型的多个组件。如果我没有将配置委托与BeginLifetimeScope()一起使用,那么它可以正常工作。不幸的是,我需要向我的子作用域添加额外的依赖项,因此不使用配置委托不是一个选项 下面是一个说明问题的示例: var builde

我发现了我认为可能是Autofac中的一个bug,但我想看看是否有人有一个可能的解决方案或解决方法,这样我就可以让它工作

基本上,我已经建立了一个通用的装饰,这工作得很好。问题是,只要我使用配置委托调用
BeginLifetimeScope()
,它就会错误地解析相同类型的多个组件。如果我没有将配置委托与
BeginLifetimeScope()
一起使用,那么它可以正常工作。不幸的是,我需要向我的子作用域添加额外的依赖项,因此不使用配置委托不是一个选项

下面是一个说明问题的示例:

var builder = new ContainerBuilder();
builder.RegisterType<Dependency>()
    .Named<IDependency<object>>("service");
builder.RegisterGenericDecorator(
    typeof(Decorator<>), typeof(IDependency<>), "service", "decorated");
var container = builder.Build();

// Returns 1
var scope1 = container.BeginLifetimeScope();
Console.WriteLine(
    scope1.ResolveNamed<IEnumerable<IDependency<object>>>("decorated").Count());

// Returns 2 - notice the configAction doesn't even have to do anything
var scope2 = container.BeginLifetimeScope(r => { });
Console.WriteLine(
    scope2.ResolveNamed<IEnumerable<IDependency<object>>>("decorated").Count());
var builder=newcontainerbuilder();
builder.RegisterType()
.命名为(“服务”);
builder.RegisterGenericDecorator(
类型(装饰人),类型(独立性),“服务”,“装饰”);
var container=builder.Build();
//返回1
var scope1=container.BeginLifetimeScope();
控制台写入线(
scope1.ResolveNamed(“修饰”).Count();
//返回2-请注意,configAction甚至不必执行任何操作
var scope2=container.BeginLifetimeScope(r=>{});
控制台写入线(
scope2.ResolveNamed(“修饰”).Count();
以下是我的假类型:

interface IDependency<T> { }

class Dependency : IDependency<object> { }

class Decorator<T> : IDependency<T> {}
interface IDependency{}
类依赖项:IDependency{}
类装饰器:IDependency{}

任何帮助都将不胜感激

它看起来确实像一个bug。作为解决办法,我最终做了以下工作:

var param = new TypedParameter(typeof(IDecoratorDependency), new DecoratorDependency());
var decorated = scope.ResolveNamed<IEnumerable<IDependency<object>>>("decorated", param);
var param=new-TypedParameter(typeof(IDecoratorDependency),new-DecoratorDependency());
var decordent=scope.ResolveNamed(“decordented”,param);
这对于我的用例来说已经足够好了。但是,这个方法是不灵活的,因为它只允许我向根对象提供参数,在本例中是
Decorator
,而不是它的任何依赖项