12

StructureMap には、スキャン時に規則を適用する機能があります。したがって、明示的な登録なしで IFoo => Foo です。

AutoFacで利用できる類似のものはありますか? 周りを見回しても、役立つものは何も見つかりません。

ありがとう、

4

2 に答える 2

17

v2 以降の Autofac バージョンの場合

Autofac2の新しいスキャン機能により、慣例による登録の必要性がいくらか取り除かれます。Plugins.dllFooにあるとしましょう:

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

ピーター、彼が言っているのは、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 に答える