由特定构造函数构造的Structuremap addalltypesof

我非常喜欢StructureMap作为IOC框架,尤其是基于约定的注册。 现在我尝试执行以下操作:当类具有默认(无参数)构造函数时,我想添加实现特定接口的所有类型。 并且必须使用此构造函数创建类型。

这是我现在直到注册正确类型的东西,但是如何指定在创建实例时应该使用默认构造函数。

public class MyRegistry : Registry { public MyRegistry() { Scan( x => { x.AssemblyContainingType(); x.Exclude(t => !HasDefaultConstructor(t)); x.AddAllTypesOf(); }); } private static bool HasDefaultConstructor(Type type) { var _constructors = type.GetConstructors(); return _constructors.Any(c => IsDefaultConstructor(c)); } private static bool IsDefaultConstructor(ConstructorInfo constructor) { return !constructor.GetParameters().Any(); } } 

有几种方法可以强制StructureMap使用特定的构造函数。 最简单的方法是将DefaultConstructor属性放在要使用的构造函数上。 假设您不想这样做,则必须创建自定义RegistrationConvention。

 public class UseCaseRegistrationConvention : IRegistrationConvention { public void Process(Type type, Registry registry) { if (type.IsAbstract || type.IsInterface || type.IsEnum) return; var useCaseInterface = type.GetInterface("IUseCase"); if (useCaseInterface == null) return; var constructor = type.GetConstructors().FirstOrDefault(c => !c.GetParameters().Any()); if (constructor != null) { registry.For(useCaseInterface).Add(c => constructor.Invoke(new object[0])); } } } 

然后在您的扫描电话​​中使用它:

 Scan(x => { x.AssemblyContainingType(); x.With(new UseCaseRegistrationConvention()); });