C# Castle windsor添加条件依赖项

C# Castle windsor添加条件依赖项,c#,castle-windsor,conditional,castle,C#,Castle Windsor,Conditional,Castle,我有两个相同界面的实现,如果用户登录,我想使用实现1;如果用户未登录,我想使用实现2。如何使用castle windsor进行配置 解决此问题的一种方法是,使用密钥注册服务,然后根据需要进行解析 public interface ISample { int Calculate(int a, int b); } class SampleB : ISample { public int Calculate(int a, int b) { return a +

我有两个相同界面的实现,如果用户登录,我想使用实现1;如果用户未登录,我想使用实现2。如何使用castle windsor进行配置

解决此问题的一种方法是,使用密钥注册服务,然后根据需要进行解析

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);
container.Register(Component.For().ImplementedBy().Named(“samreak”).lifety.Transient);
container.Register(Component.For().ImplementedBy().Named(“SampleB”).lifety.Transient);
//需要时解决

var sampleA = container.Resolve<ISample>("SampleA");
var-samreak=container.Resolve(“samreak”);
//确定何时需要样本

var sampleB = container.Resolve<ISample>("SampleB");
var-sampleB=container.Resolve(“sampleB”);
您可以添加一个,它可以根据是否设置了
Thread.CurrentPrincipal
(或者
HttpContext.Current.Request.IsAuthenticated
在ASP.NET/MVC中,如果我没记错的话)在可用实现之间进行选择

处理程序选择器可能看起来像这样:

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; } 
    }
    // ....
}

处理程序选择器的唯一缺点是它们不是从容器中提取出来的,即它们是在注册时作为实例添加到容器中的,因此它们不需要注入依赖项、管理生活方式等。,但有一些方法可以缓解这种情况——看看您是否有兴趣了解如何做到这一点。

除非您更改/扩展其内部实现,否则windsor无法知道用户是否登录。中间可以有一个Decider类,它将考虑“登录因子”并给出所需的实现。Windsor确实有这样的机制(参见mookid的回答),根本不需要更改其内部实现。谢谢,我的意思是说扩展而不是“更改”+1适用于mookids的answeer。只要您有权访问容器,您就可以使用此解决方案,通常情况下您不会。我想知道3.0版本是否有任何更改,我的意思是是否仍然需要外部设施。