繁体   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