我有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的回答),根本没有必要改变它的内部实现。 –