AutoFac自动装配约定

时间:2009-10-26 17:15:08

标签: inversion-of-control ioc-container autofac

StructureMap能够在扫描时应用约定。因此,IFoo => Foo,没有明确的注册。

AutoFac中有类似的东西吗?环顾四周,找不到任何有用的东西。

谢谢,

2 个答案:

答案 0 :(得分:17)

适用于v2

的Autofac版本

Autofac2中的新scanning features将删除按惯例注册的一些需求。让我们说Foo存在于Plugins.dll中:

var assembly = Assembly.Load("Plugins");
builder.RegisterAssemblyTypes(assembly)
       .AsImplementedInterfaces();

此注册会选择Foo并将其注册为IFoo

对于小于v2

的Autofac版本

您可以使用ContainerBuilder.RegisterTypesMatching。这是一个例子:

var builder = new ContainerBuilder();
builder.RegisterTypesMatching(type => type.IsAssignableFrom(typeof(IFoo)));
var container = builder.Build();

var foo = container.Resolve<Foo>();

答案 1 :(得分:0)

Peter,他的意思是StructureMap中提供的默认约定扫描。它自动绑定IX和X,其中X是实现接口IX的类。它的工作原理如下:

public override void Process(Type type, Registry registry)
{
    if (!type.IsConcrete()) return;

    Type pluginType = FindPluginType(type);
    if (pluginType != null && Constructor.HasConstructors(type))
    {
        registry.AddType(pluginType, type);
        ConfigureFamily(registry.For(pluginType));
    }
}

public virtual Type FindPluginType(Type concreteType)
{
    string interfaceName = "I" + concreteType.Name;
    Type[] interfaces = concreteType.GetInterfaces();
    return Array.Find(interfaces, t => t.Name == interfaceName);
}

我还想知道Autofac是否支持类似的事情。 StructureMap允许您定义自己的IRegistrationConvention。这是一个惯例的一个例子。