StructureMap能够在扫描时应用约定。因此,IFoo => Foo,没有明确的注册。
AutoFac中有类似的东西吗?环顾四周,找不到任何有用的东西。
谢谢,
答案 0 :(得分:17)
Autofac2中的新scanning features将删除按惯例注册的一些需求。让我们说Foo
存在于Plugins.dll中:
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>();
答案 1 :(得分: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。这是一个惯例的一个例子。