StructureMap setter注入使用泛型的属性

时间:2014-03-12 10:18:53

标签: generics dependency-injection structuremap

编辑:清除了一些名称并使示例更易于阅读。

这堂课:

public class EntranceService : IEntranceService
{
    public IMyNotifier<Entrance> Notifier { get; set; }


    public EntranceService(IRepositoryConfigDb<Entrance> repo   )
    {
        this.repo = repo;
    }
}

我想使用Notifier属性通过setter注入注入。如您所见,通告程序使用具有开放泛型类型的接口,因此我无法执行以下操作:

x.SetAllProperties(p => p.OfType<IMyNotifier<IEntity>>());

StructureMap不喜欢它。 这就是IMyNotifier的样子:

public interface  IMyNotifier<T> where  T : class, IEntity, new()

编辑:这导致我必须为IEntity的每个具体实施设置规则,如下所示:

x.SetAllProperties(setter => setter.OfType<IMyNotifier<Entrance>>());
x.SetAllProperties(setter => setter.OfType<IMyNotifier<Something>>());
x.SetAllProperties(setter => setter.OfType<IMyNotifier<Endpoint>>());
x.SetAllProperties(setter => setter.OfType<IMyNotifier<Interaction>>());
x.SetAllProperties(setter => setter.OfType<IMyNotifier<Queue>>());
x.SetAllProperties(setter => setter.OfType<IMyNotifier<Group>>());

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

好的,这不是太难......你只需要使用一种稍微不同的方法来查看你想要设置的属性。

 x.SetAllProperties(
    p=> p.TypeMatches(
           t=>t.IsInterface 
              && t.IsGenericType 
              && t.GetGenericTypeDefinition() == typeof(IMyNotifier<>)
    )
 );

这样做是针对谓词查看属性类型。所以我们看到它是一个接口,它是通用的,然后获得开放的泛型并将其与我们想要匹配的内容进行比较。