如何在容器创建后使用autoface注册类型

本文关键字:autoface 注册 类型 创建 | 更新日期: 2023-09-27 17:50:15

我有一个基础设施单例,我想从autoface中解决

在创建容器时,我将AppPaths注册为单例

然而,出于各种原因(测试,一些基础设施的事情),我希望能够在运行时用一个新的实例交换该实例。假设一个派生类型为class AppPaths2 : AppPaths

我找不到这样做的API。

我可以使用CommentServiceLocator来获得IComponentContext的实例,但我没有看到从那里解决问题的方法。

如何在容器创建后使用autoface注册类型

您可以使用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>,你将有你所有的实现。