[英]How to register a type with autofac after container creation
我有一個基礎結構單例,我想從autofac中解決
創建容器時,我將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>
,則將具有所有實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.