2014-03-12 74 views
0

編輯:清除了一些名稱並使示例更易於閱讀。使用泛型的屬性的StructureMap設置器注入

這個類:

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


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

我想使用的通告程序屬性通過setter注入注入。正如你所看到的通知使用的界面與開放式泛型類型,因此我不能做到以下幾點:

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

StructureMap不喜歡它。 這是IMyNotifier的樣子:

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

編輯:這使我不得不爲每個規則和IEntity每一個具體的FPGA實現,像這樣:

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>>()); 

任何幫助表示讚賞!

+0

在大多數情況下,您應該傾向於構造函數注入而不是屬性注入。在這種情況下,爲什麼你需要使用屬性注入是否有特定的原因? – Steven

+0

Hello Steven,我同意,但這是一個單獨的事情。這個問題是特定於定義Setter注入。 – imbageek

回答

1

好的,這不是太難..你只需要使用稍微不同的方法來查看你想設置的屬性。

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

這是做什麼看對謂詞的屬性類型。所以我們看到它是一個接口,它是通用的,然後獲得開放的泛型並將其與我們想要匹配的比較。