使用插件覆盖autofac注册

时间:2013-04-02 01:35:41

标签: c# dependency-injection autofac

我有一个由IFoo实施的DefaultFoo服务,我已经在我的autofac容器中注册了它。

现在我想允许在插件程序集中实现IFoo的替代实现,可以将其放在“plugins”文件夹中。如果它存在,如何配置autofac以更喜欢这个替代实现?

2 个答案:

答案 0 :(得分:15)

如果您注册了一些接口实现,Autofac将使用最新的注册。其他注册将被覆盖。在您的情况下,如果存在插件并且注册自己的IFoo服务实现,Autofac将使用插件注册。

  

如果多个组件公开同一服务,Autofac将使用最后注册的组件作为该服务的默认提供者。

请参阅Default Registrations

答案 1 :(得分: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);