在Autofac中,如何更改在调用Build之后注册的实例?

时间:2010-10-18 03:50:45

标签: .net dependency-injection ioc-container autofac

让我说我有这个代码

var builder = new ContainerBuilder();
builder.RegisterInstance(new MyType());
var container = builder.Build();

然后一段时间后,我想要为MyType上调用的所有未来结算更改container的实例。

3 个答案:

答案 0 :(得分:47)

当您想要更改注册时,请创建一个新的ContainerBuilder,注册新实例,并在容器中调用Update

// at some later point...
builder = new ContainerBuilder();
builder.RegisterInstance(myType2);
builder.Update(container);

答案 1 :(得分:20)

另一种方法是注册一个能够更改容器提供的基础实例的委托。请考虑以下代码:

 var theInstance = new MyType();
 var builder = new ContainerBuilder();
 builder.Register(context => theInstance);
 builder.Register<Action<MyType>>(context => newInstance => theInstance = newInstance);
 var container = builder.Build();

您现在可以解决操作以获取可以更改注册的委托:

 var updateInstance = c.Resolve<Action<MyType>>();
 updateInstance(new MyType());

注意:如果您可以详细说明何时需要更改 ,我们甚至可以找到更好的解决方案。

答案 2 :(得分:0)

您还可以利用Autofac Lifetime事件“ OnActivating”,并在内存中拥有自己的控制器对象,像这样替换已解析的实例

builder.Register<TInterface>(c => c.Resolve<TConcrete>())
       .OnActivating(e => e.ReplaceInstance(new TInterfaceSubclass()));

https://autofaccn.readthedocs.io/en/latest/lifetime/events.html#onactivating