Переопределить регистрацию автозапуска с помощью плагина
У меня есть IFoo
сервис, реализованный DefaultFoo
, и я зарегистрировал его как таковой в моем autofac контейнере.
Теперь я хотел бы разрешить альтернативную реализацию IFoo
для реализации в сборке плагинов, которую можно удалить в папке "плагины". Как настроить autofac, чтобы предпочесть эту альтернативную реализацию, если она присутствует?
Ответы
Ответ 1
Если вы зарегистрируете некоторые реализации интерфейса, Autofac будет использовать последнюю регистрацию. Другие регистрации будут отменены. В вашем случае Autofac будет использовать регистрацию плагина, если плагин существует и зарегистрировать собственную реализацию сервиса IFoo.
Если более одного компонента предоставляет одну и ту же услугу, Autofac будет использовать последний зарегистрированный компонент в качестве поставщика по умолчанию этой службы.
См. Раздел " Регистрация по умолчанию"
Ответ 2
Как указано в Memoizer, последняя регистрация переопределяет предыдущие. У меня получилось что-то вроде этого:
// gather plugin assemblies
string applicationPath = Path.GetDirectoryName(
Assembly.GetEntryAssembly().Location);
string pluginsPath = Path.Combine(applicationPath, "plugins");
Assembly[] pluginAssemblies =
Directory.EnumerateFiles(pluginsPath, "*.dll")
.Select(path => Assembly.LoadFile(path))
.ToArray();
// register types
var builder = new ContainerBuilder();
builder.Register<IFoo>(context => new DefaultFoo());
builder.RegisterAssemblyTypes(pluginAssemblies)
.Where(type => type.IsAssignableTo<IFoo>())
.As<IFoo>();
// test which IFoo implementation is selected
var container = builder.Build();
IFoo foo = container.Resolve<IFoo>();
Console.WriteLine(foo.GetType().FullName);