我有 2 个相同接口(interface)的实现,如果用户已登录,我想使用实现 1,如果用户未登录,我想使用实现 2。我如何使用 caSTLe windsor 配置它?
最佳答案
您可以添加 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; }
}
// ....
}
处理程序选择器的唯一缺点是它们不是从容器中提取出来的——也就是说,它们是在注册时作为一个实例添加到容器中的,所以它们不需要注入(inject)依赖项、管理生活方式等。 ,但有一些方法可以缓解这种情况 - 看看 F.T.Windsor如果您有兴趣了解如何做到这一点。
关于c# - CaSTLe windsor 添加条件依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7502026/