Переопределить регистрацию автозапуска с помощью плагина

У меня есть 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);