Autofac:替代实现,但注入旧的实现
本文关键字:实现 注入 Autofac | 更新日期: 2023-09-27 18:05:51
我正在编写一个事件源应用程序。我有一个由EventStore
类实现的IEventStore
。但是,在调试时,我想将IEventStore
实现为DebuggingEventStore
类。
我能以某种方式在DebuggingEventStore
的构造函数得到我的EventStore
(旧的实现)注入?我看过装饰器,但我不确定在这种情况下它是否是正确的方法。
IEventStore
实现为EventStore
。
IEventStore
调试时被实现为DebuggingEventStore
我想要的
DebuggingEventStore
通过其构造函数注入旧的IEventStore
(即EventStore
)。
你可以实现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>();