我真的很喜欢StructureMap作为IOC框架,特别是基于会议的注册。现在我尝试执行以下操作:当类具有默认(无参数)构造函数时,我想添加实现特定接口的所有类型。必须使用此构造函数创建类型。
这就是我现在所用的,它注册了正确的类型,但是如何指定在创建实例时应该使用默认构造函数。
public class MyRegistry : Registry
{
public MyRegistry()
{
Scan(
x =>
{
x.AssemblyContainingType<IUseCase>();
x.Exclude(t => !HasDefaultConstructor(t));
x.AddAllTypesOf<IUseCase>();
});
}
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();
}
}
答案 0 :(得分:1)
有几种方法可以强制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<IUseCase>();
x.With(new UseCaseRegistrationConvention());
});