如何注册装饰器才能解析装饰器

How to register decorator to be able to resolve decoree

我正在使用 Autofac。 我正在尝试使用装饰器模式使用相同的界面注册 2 类。

public interface IDoable
{
    string Do();
}

public class Decoree : IDoable
{
    public string Do()
    {
        return "decoree";
    }
}

public class Decorator : IDoable
{
    public IDoable InnerDecoree { get; set; }

    public Decorator(IDoable doable)
    {
        this.InnerDecoree = doable;
    }

    public string Do()
    {
        return InnerDecoree.Do() + "decorator";
    }
}

我想使用容器来解析 2 种不同情况下的 两种 类型:

实现它的唯一方法是使用以下代码:

[Fact]
public void Both()
{
    var builder = new ContainerBuilder();
    builder.RegisterType<Decoree>()
           .Named<IDoable>("decoree")
           .SingleInstance();

    builder.RegisterType<Decoree>() // but this is not right I'd like to register it on line above somehow...
        .AsSelf()
        .SingleInstance(); 

    builder.RegisterType<Decorator>()
           .Named<IDoable>("decorator")
           .SingleInstance();

    builder.RegisterDecorator<IDoable>(
            (c, inner) => c.ResolveNamed<IDoable>("decorator", TypedParameter.From(inner)), "decoree")
            .As<IDoable>();

    var container = builder.Build();

    Assert.IsType<Decoree>(container.Resolve<Decoree>());
    Assert.False(container.IsRegistered<Decorator>());
    Assert.IsType<Decorator>(container.Resolve<IDoable>());


    var decoree = container.Resolve<Decoree>();
    var decorator = container.Resolve<IDoable>();
    var doable = ((Decorator)decorator).InnerDecoree;

    Assert.Same(decoree, doable); // FALSE :(

}

问题是我真的很希望最后一个断言是真的 :) 所以它是同一个实例。

基本上我的问题是:是否可以使用 namedtype 两种方式注册类型?

因为您没有在注册中指定范围,所以每次解析时您都会得到一个不同的 Decoree 实例。我会尝试像

这样的东西
builder.RegisterType<Decoree>()
       .Named<IDoable>("decoree").SingleInstance();

此外,您可能需要合并 Decoree 类型的 2 个注册:

builder.RegisterType<Decoree>()
       .Named<IDoable>("decoree")
       .AsSelf()
       .SingleInstance();