2013-04-02 2 views
11

У меня есть услуга IFoo, осуществляемая DefaultFoo, и я зарегистрировал ее как таковой в контейнере с автозагрузкой.Переопределение регистрации autofac с плагином

Теперь я хотел бы предоставить альтернативную реализацию IFoo, которая будет реализована в сборке плагина, которая может быть удалена в папке «плагины». Как настроить autofac, чтобы предпочесть эту альтернативную реализацию, если она присутствует?

ответ

11

Если вы зарегистрируете некоторые реализации интерфейса, Autofac будет использовать самую последнюю регистрацию. Другие регистрации будут отменены. В вашем случае Autofac будет использовать регистрацию плагина, если плагин существует и зарегистрировать собственную реализацию сервиса IFoo.

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

См Default Registrations

+0

Является ли это ожидаемым поведением с Autofac или просто совпадением? У вас есть ссылки? –

+2

Предполагается, что: http://docs.autofac.org/en/latest/register/registration.html#default-regations –

+1

Обратите внимание, что другие регистрации не переоцениваются! Autofac будет использовать последний зарегистрированный компонент, но предыдущие компоненты могут быть разрешены (например, Resolve >) –

1

Как заявил 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); 
+0

Это очень полезно для тестирования, поскольку позволяет переопределять регистрацию _default_ с помощью своих _test_-аналогов. – t3chb0t

Смежные вопросы