让我说我有这个代码
var builder = new ContainerBuilder();
builder.RegisterInstance(new MyType());
var container = builder.Build();
然后一段时间后,我想要为MyType
上调用的所有未来结算更改container
的实例。
答案 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