我有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. 城堡溫莎propogating直列依賴
- 2. 城堡windsor不注入依賴屬性
- 3. 解決Windsor城堡的依賴問題
- 4. 城堡工廠短期生活依賴
- 5. 使用溫莎城堡的WCF依賴注入 - 請幫忙?
- 6. 城堡溫莎流利的API:作爲依賴
- 7. 可以城堡解決交叉依賴屬性?
- 8. 城堡溫莎3測試版1 - ArrayResolver依賴沒有注入
- 9. 看似循環依賴造成的問題與溫莎城堡
- 10. 編程修改在溫莎城堡的依賴
- 11. Gradle - 在buildscript依賴關係中添加條件類路徑
- 12. 充氣城堡加密
- 13. 如何添加依賴文件到Scala?
- 14. 添加jar文件依賴關係
- 15. 添加控件依賴於sql表?
- 16. Maven - 添加對工件源的依賴
- 17. 添加cordova插件依賴build.gradle
- 18. maven條件依賴關係
- 19. 安裝與依賴條件
- 20. 有條件依賴注入
- 21. 創建依賴條件
- 22. 添加maven依賴關係
- 23. 添加依賴我RCPP包
- 24. ngMockE2E - 添加到依賴性
- 25. 錯誤添加依賴
- 26. Gradle:添加依賴關係
- 27. 添加新的依賴
- 28. 如何解決使用城堡windsor依賴瞬態上下文數據的依賴關係?
- 29. 城堡DynamicProxy攔截事件
- 30. 將條件添加到CakePHP模型中的依賴項? (或一起依賴於多件事)
你會在哪裏調用'container.Resolve()'? –
Windsor無法知道用戶是否登錄,除非您更改/擴展它的內部實現。可以有一個Decider類,它將考慮帳戶中的「登錄因素」並給出所需的實現。 –
Windsor *確實有這方面的機制(參見mookid的回答),根本沒有必要改變它的內部實現。 –