2011-02-12 33 views

回答

18

StructureMap支持setter/property injection。所以,你可以做到以下幾點:

public class SomeController : Controller 
{ 
    [SetterProperty] 
    public IService Service { get; set; } 
} 

然後:

ObjectFactory.Initialize(x => 
{ 
    x.For<IService>() 
    .Use<ServiceImpl>(); 
}); 

,或者如果你不喜歡用StructureMap具體塞滿您的控制器的想法屬性,你可以這樣配置它:

ObjectFactory.Initialize(x => 
{ 
    x.For<IService>() 
    .Use<ServiceImpl>(); 

    x.ForConcreteType<SomeController>() 
    .Configure 
    .Setter<IService>(c => c.Service) 
    .IsTheDefault(); 
}); 

另請注意,屬性注入適用於此屬性的存在對於控制器的正確功能不是強制性的情況。例如想一下記錄器。如果控制器的使用者沒有將任何特定的記錄器實現注入到屬性中,那麼控制器仍然工作,只是它不記錄。在你的情況下,你正在使用一個服務,如果你的控制器動作依賴於這個服務,我會使用構造器注入。所以你應該問自己的問題是:如果此屬性爲null,我的控制器會在我調用某個動作時崩潰?如果這個問題的答案是肯定的,那麼我會推薦構造函數注入。另外,當你使用構造函數注入時,你強制這個控制器的使用者指定一個實現,因爲如果不在構造函數中傳遞適當的服務,他就無法獲得控制器的實例。

+1

感謝Darin。我仍然試圖爲我的項目在`StructureMap`和`Castle.Windsor`之間做出決定,而屬性注入對我來說非常重要。你知道`StructureMap`是否可以注入MVC​​動作過濾器或模型綁定器嗎? – Ciel 2011-02-15 14:26:59

4

注入依賴某種類型的所有屬性,使用SetAllProperties方法,你的ObjectFactory的初始化的一部分:

ObjectFactory.Initialize(x => 
{ 
    x.SetAllProperties(x => x.OfType<IService>()); 
}); 

也可以爲setter注入定義策略,看this post