12

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

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

谢谢,

4

2 回答 2

17

对于 v2 的 Autofac 版本

Autofac2 中的新扫描功能将消除一些按惯例注册的需要。假设它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>();
于 2009-11-02T11:33:14.750 回答
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。这是约定的一个例子。

于 2010-04-30T12:49:40.147 回答