StructureMap 能够在扫描时应用约定。因此 IFoo => Foo,没有显式注册。
AutoFac 中是否有类似的功能?环顾四周,找不到任何有用的东西。
谢谢,
StructureMap 能够在扫描时应用约定。因此 IFoo => Foo,没有显式注册。
AutoFac 中是否有类似的功能?环顾四周,找不到任何有用的东西。
谢谢,
Autofac2 中的新扫描功能将消除一些按惯例注册的需要。假设它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>();
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。这是约定的一个例子。