В Autofac как изменить экземпляр, который зарегистрирован после вызова Build? - PullRequest
30 голосов
/ 18 октября 2010

Допустим, у меня есть этот код

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

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

Ответы [ 3 ]

47 голосов
/ 18 октября 2010

В то время, когда вы хотите изменить регистрацию, создайте новый ContainerBuilder, зарегистрируйте новый экземпляр и вызовите Update, передавая в контейнер:

// at some later point...
builder = new ContainerBuilder();
builder.RegisterInstance(myType2);
builder.Update(container);
20 голосов
/ 18 октября 2010

Альтернативой может быть регистрация делегата, способного изменить базовый экземпляр, предоставленный контейнером. Рассмотрим следующий код:

 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());

Примечание: если бы вы могли уточнить , когда и , почему вам нужно изменить экземпляр, возможно, мы могли бы даже найти лучшее решение.

0 голосов
/ 22 января 2019

Вы также можете использовать событие 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

...