StructureMap имеет возможность применять соглашения при сканировании. Таким образом, IFoo = > Foo, без явной регистрации.
Есть ли что-то симулятивное в AutoFac? Посмотрел вокруг и не мог найти ничего полезного.
Спасибо,
StructureMap имеет возможность применять соглашения при сканировании. Таким образом, IFoo = > Foo, без явной регистрации.
Есть ли что-то симулятивное в AutoFac? Посмотрел вокруг и не мог найти ничего полезного.
Спасибо,
var assembly = Assembly.Load("Plugins");
builder.RegisterAssemblyTypes(assembly)
.AsImplementedInterfaces();
Эта регистрация подберет Foo
и зарегистрирует ее как IFoo
.
Вы можете использовать ContainerBuilder.RegisterTypesMatching. Вот пример:
var builder = new ContainerBuilder();
builder.RegisterTypesMatching(type => type.IsAssignableFrom(typeof(IFoo)));
var container = builder.Build();
var foo = container.Resolve<Foo>();
Питер, он имеет в виду стандартное сканирование по умолчанию, которое доступно в 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. Это один из примеров соглашения.