我有两个相同接口的实现,希望在用户登录时使用implementation1,在未登录时使用implementation2。如何使用Castle Windsor配置这个呢?
我有两个相同接口的实现,希望在用户登录时使用implementation1,在未登录时使用implementation2。如何使用Castle Windsor配置这个呢?
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; }
}
// ....
}
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");