Autofac:替代实现,但注入旧的实现

本文关键字:实现 注入 Autofac | 更新日期: 2023-09-27 18:05:51

我正在编写一个事件源应用程序。我有一个由EventStore类实现的IEventStore。但是,在调试时,我想将IEventStore实现为DebuggingEventStore类。

我能以某种方式在DebuggingEventStore的构造函数得到我的EventStore(旧的实现)注入?我看过装饰器,但我不确定在这种情况下它是否是正确的方法。

<标题> 之前

IEventStore实现为EventStore

现在

IEventStore调试时被实现为DebuggingEventStore

我想要的

DebuggingEventStore通过其构造函数注入旧的IEventStore(即EventStore)。

Autofac:替代实现,但注入旧的实现

你可以实现DebuggingEventStore,让它在构建iOS容器时被注入构造函数中。

实际上,DebuggingEventStore将实现EventStore,并将EventStore作为构造函数参数。

void Main()
{
    var builder = new ContainerBuilder();
    builder.RegisterType<EventStore>().AsSelf();
    builder.Register(cc => new DebugingEventStore(cc.Resolve<EventStore>())).As<IEventStore>();
    var container = builder.Build();
    container.Resolve<IEventStore>().DoWork();
}
public interface IEventStore
{
    void DoWork();
}
public class EventStore : IEventStore
{
    public EventStore(Foo doo, Bar bar)
   { ....} 
    void IEventStore.DoWork()
    {
        Console.WriteLine("EventStore");
    }
}
public class DebuggingEventStore: IEventStore
{
    private IEventStore _internalEventStore;
    public DebuggingEventStore(IEventStore eventStore)
    {
        this._internalEventStore = eventStore;
    }
    void IEventStore.DoWork()
    {
        this._internalEventStore.DoWork();
        Console.WriteLine("DebuggingEventStore");
    }
}

正如Nicholas Blumhardt在这里所描述的,在Autofac中注册(非泛型)装饰器的典型方法如下:

builder.RegisterType<EventStore>()
    .Named<IEventStore>("implementor");
builder.RegisterDecorator<IEventStore>(
    (c, decoratee) => new DebuggingEventStore(decoratee),
    fromKey: "implementor");

但是,我认为@KnightFox的答案在注册非通用装饰器时更清晰:

builder.RegisterType<EventStore>().AsSelf();
builder.Register(c => new DebugingEventStore(c.Resolve<EventStore>()))
    .As<IEventStore>();