Подтвердить что ты не робот

Условные обозначения Autofac Autowiring

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

Есть ли что-то симулятивное в AutoFac? Посмотрел вокруг и не мог найти ничего полезного.

Спасибо,

4b9b3361

Ответ 1

Для версий 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>();

Ответ 2

Питер, он имеет в виду стандартное сканирование по умолчанию, которое доступно в 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. Это один из примеров соглашения.