В Autofac, как мне изменить экземпляр, зарегистрированный после вызова Build?
Итак, скажем, у меня этот код
var builder = new ContainerBuilder();
builder.RegisterInstance(new MyType());
var container = builder.Build();
Затем через некоторое время я хочу изменить экземпляр MyType
для всех будущих разрешений, вызываемых в container
.
Ответы
Ответ 1
В то время, когда вы хотите изменить регистрацию, создайте новый ContainerBuilder
, зарегистрируйте новый экземпляр и вызовите Update
, проходящий в контейнере:
// at some later point...
builder = new ContainerBuilder();
builder.RegisterInstance(myType2);
builder.Update(container);
Ответ 2
Альтернативой может быть регистрация делегата, который может изменить базовый экземпляр, предоставленный контейнером. Рассмотрим следующий код:
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());
Примечание:, если вы можете уточнить, когда и почему вам нужно изменить экземпляр, возможно, мы сможем найти лучшее решение.
Ответ 3
Вы также можете использовать событие 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