Structuremap addalltypesof由特定构造函数构造

时间:2011-04-12 10:21:31

标签: c# structuremap

我真的很喜欢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();
    }
}

1 个答案:

答案 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());
   });