我有2個實現相同的接口,並希望使用implementation1如果用戶登錄或implementation2如果用戶沒有登錄。我怎樣才能配置這與城堡windsor?城堡windor添加條件依賴
7
A
回答
1
解決此問題的一種方法是:用鍵註冊服務,然後根據需要進行解析。
public interface ISample
{
int Calculate(int a, int b);
}
class SampleB : ISample
{
public int Calculate(int a, int b)
{
return a + b + 10;
}
}
class SampleA : ISample
{
public int Calculate(int a, int b)
{
return a + b;
}
}
登記:
container.Register(Component.For<ISample>().ImplementedBy<SampleA>().Named("SampleA").LifeStyle.Transient);
container.Register(Component.For<ISample>().ImplementedBy<SampleB>().Named("SampleB").LifeStyle.Transient);
//當SampleA需要解決。
var sampleA = container.Resolve<ISample>("SampleA");
//解決SampleB需要的問題。
var sampleB = container.Resolve<ISample>("SampleB");
7
你可以添加一個handler selector,這將是能夠根據例如可用的實現之間進行選擇是否設置了Thread.CurrentPrincipal
(如果我沒有記錯,那麼在ASP.NET/MVC中爲HttpContext.Current.Request.IsAuthenticated
)。
的處理器選擇可能會看起來有點像這樣:
public class MyAuthHandlerSelector : IHandlerSelector
{
public bool HasOpinionAbout(string key, Type service)
{
return service == typeof(ITheServiceICareAbout);
}
public IHandler SelectHandler(string key, Type service, IHandler[] handlers)
{
return IsAuthenticated
? FindHandlerForAuthenticatedUser(handlers)
: FindGuestHandler(handlers);
}
bool IsAuthenticated
{
get { return Thread.CurrentPrincipal != null; }
}
// ....
}
只有處理器選擇的缺點是,他們沒有從容器拉 - 即他們在註冊時添加一個實例到容器所以他們沒有注入依賴關係,管理生活方式等,但是有一些方法可以緩解這種情況 - 如果您有興趣瞭解如何完成這項工作,請參閱F.T.Windsor。
+1
想知道3.0版本是否有任何改變 - 我的意思是如果它仍然需要外部設施。 – Giedrius
相關問題
- 1. 城堡工廠短期生活依賴
- 2. 城堡windsor不注入依賴屬性
- 3. 解決Windsor城堡的依賴問題
- 4. 城堡溫莎propogating直列依賴
- 5. 城堡溫莎組件依賴關係和生活方式
- 6. 條件依賴
- 7. 城堡溫莎3測試版1 - ArrayResolver依賴沒有注入
- 8. 使用溫莎城堡的WCF依賴注入 - 請幫忙?
- 9. 可以城堡解決交叉依賴屬性?
- 10. ASP.NET MVC城堡溫莎和依賴注入
- 11. 編程修改在溫莎城堡的依賴
- 12. 看似循環依賴造成的問題與溫莎城堡
- 13. MVC5注入與城堡windsor視圖的依賴關係
- 14. 如何解決溫莎城堡工廠的依賴問題?
- 15. 城堡溫莎流利的API:作爲依賴
- 16. 而添加依賴
- 17. 添加JAR依賴
- 18. 充氣城堡加密
- 19. 根據Maven中給定的條件添加依賴關係
- 20. Gradle - 在buildscript依賴關係中添加條件類路徑
- 21. 如何解決使用城堡windsor依賴瞬態上下文數據的依賴關係?
- 22. Sbt插件添加依賴項目/ build.sbt
- 23. 添加cordova插件依賴build.gradle
- 24. Maven - 添加對工件源的依賴
- 25. 添加控件依賴於sql表?
- 26. 爲XBMC插件添加python依賴項
- 27. 如何添加依賴文件到Scala?
- 28. 添加jar文件依賴關係
- 29. 安裝與依賴條件
- 30. 依賴注入:條件
你會在哪裏調用'container.Resolve()'? –
Windsor無法知道用戶是否登錄,除非您更改/擴展它的內部實現。可以有一個Decider類,它將考慮帳戶中的「登錄因素」並給出所需的實現。 –
Windsor *確實有這方面的機制(參見mookid的回答),根本沒有必要改變它的內部實現。 –