AutoFac Условные обозначения - PullRequest
12 голосов
/ 26 октября 2009

StructureMap имеет возможность применять соглашения при сканировании. При этом IFoo => Foo, без явной регистрации.

Есть ли что-то похожее в AutoFac? Осмотрелся и не смог найти ничего полезного.

Спасибо,

Ответы [ 2 ]

17 голосов
/ 02 ноября 2009

Для версий Autofac от v2

Новые функции сканирования в Autofac2, по сути, устранят необходимость регистрации по соглашению. Допустим, Foo живет в Plugins.dll:

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

Эта регистрация получит Foo и зарегистрирует его как IFoo.

Для версий Autofac менее v2

Вы можете использовать ContainerBuilder.RegisterTypesMatching. Вот пример:

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

var foo = container.Resolve<Foo>();
0 голосов
/ 30 апреля 2010

Питер, он имеет в виду стандартное сканирование, которое доступно в 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. Это один из примеров конвенции.

...