簡體   English   中英

創建容器后如何在autofac中注冊類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM