Подтвердить что ты не робот

В Autofac, как мне изменить экземпляр, зарегистрированный после вызова Build?

Итак, скажем, у меня этот код

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

Затем через некоторое время я хочу изменить экземпляр MyType для всех будущих разрешений, вызываемых в container.

4b9b3361

Ответ 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