【问题标题】:Autofac generic decorator is duplicating componentsAutofac 通用装饰器正在复制组件
【发布时间】:2013-09-30 04:31:13
【问题描述】:

我发现我认为可能是 Autofac 中的一个错误,但我想看看是否有人有可能的解决方案或解决方法,以便我可以完成这项工作。

基本上我已经设置了一个通用的装饰器,它工作得很好。问题是,一旦我使用配置委托调用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());

这是我的假类型:

interface IDependency<T> { }

class Dependency : IDependency<object> { }

class Decorator<T> : IDependency<T> {}

任何帮助将不胜感激!

【问题讨论】:

    标签: c# dependency-injection inversion-of-control decorator autofac


    【解决方案1】:

    它看起来确实像一个错误。作为一种解决方法,我最终做了以下事情:

    var param = new TypedParameter(typeof(IDecoratorDependency), new DecoratorDependency());
    var decorated = scope.ResolveNamed<IEnumerable<IDependency<object>>>("decorated", param);
    

    这对我的用例来说已经足够好了。但是,此方法不灵活,因为它只允许我向根对象提供参数,在本例中为 Decorator&lt;T&gt;,但不能提供其任何依赖项。

    【讨论】:

      猜你喜欢
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      相关资源
      最近更新 更多