如何在容器创建后使用autoface注册类型
本文关键字:autoface 注册 类型 创建 | 更新日期: 2023-09-27 17:50:15
我有一个基础设施单例,我想从autoface中解决
在创建容器时,我将AppPaths
注册为单例
然而,出于各种原因(测试,一些基础设施的事情),我希望能够在运行时用一个新的实例交换该实例。假设一个派生类型为class AppPaths2 : AppPaths
。
我找不到这样做的API。
我可以使用CommentServiceLocator来获得IComponentContext
的实例,但我没有看到从那里解决问题的方法。
您可以使用Action<T>
来更改当前变量的值。
Foo foo = new Foo();
builder.RegisterInstance(foo);
builder.Register<Action<Foo>>(c => newFoo => foo = newFoo);
然后,你将能够改变当前的Foo
使用:
Action<Foo> fooUpdater = c.Resolve<Action<Foo>>()();
fooUpdater(new Foo());
您也可以使用FooContainer
。
class FooContainer
{
public FooContainer(Foo originalValue)
{
this.Value = originalValue;
}
public Foo Value { get; set; }
}
// ...
builder.RegisterType<FooContainer>().SingleInstance();
builder.Register(c => c.Resolve<FooContainer>().Value).As<Foo>();
// ...
c.Resolve<FooContainer>().Value = new Foo();
另一个解决方案是更新容器:
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterInstance(new Foo()).AsSelf();
IContainer container = builder.Build();
using (ILifetimeScope scope = container.BeginLifetimeScope())
{
ContainerBuilder updater = new ContainerBuilder();
updater.RegisterInstance(new Foo()).AsSelf(); // new instance of Foo
updater.Update(scope.ComponentRegistry);
scope.Resolve<Foo>(); // ==> new instance of Foo
}
但是这样做只会在组件注册表中添加一个新的注册。如果你解决了IEnumerable<Foo>
,你将有你所有的实现。