0

我正在使用 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";
    }
}

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

  • IDoable我希望该实例是Decorator
  • 针对Decoree我真正需要解决特定Decoree实例的具体情况。

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

[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 :(

}

问题是我真的很喜欢最后一个断言是真的:) 所以这是同一个例子。

基本上我的问题是:是否可以使用named和type两种方式注册type

4

1 回答 1

2

Because you aren't specifying a scope in your registration, you are getting a different instance of Decoree every time it gets resolved. I would try something like

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

In addition, you might need to combine your 2 registrations of the Decoree type:

builder.RegisterType<Decoree>()
       .Named<IDoable>("decoree")
       .AsSelf()
       .SingleInstance();
于 2018-10-24T13:51:23.897 回答