Model view controller Castle Windsor解决MVC区域接口的错误实现

Model view controller Castle Windsor解决MVC区域接口的错误实现,model-view-controller,inversion-of-control,castle-windsor,ioc-container,Model View Controller,Inversion Of Control,Castle Windsor,Ioc Container,我的解决方案的核心项目:IPersonManager中有一个接口,它有两个具体的实现,它们属于各自的项目 在我的web项目中,有一个表示这两个项目的MVC区域,每个区域中都有一个框架安装程序类,它将person manager类注册到每个区域中的接口,如下所示: container.Register(AllTypes .FromAssemblyNamed("MySolution.MyProject")

我的解决方案的核心项目:IPersonManager中有一个接口,它有两个具体的实现,它们属于各自的项目

在我的web项目中,有一个表示这两个项目的MVC区域,每个区域中都有一个框架安装程序类,它将person manager类注册到每个区域中的接口,如下所示:

 container.Register(AllTypes
                         .FromAssemblyNamed("MySolution.MyProject")
                               .Where(t => t.Name.EndsWith("Manager"))
                               .WithService.DefaultInterface()
                               .Configure(x => x.LifeStyle.PerWebRequest)
            );
在注册之后,当我在内核上为IPersonManager接口获取处理程序时,我得到以下结果:

{Castle.MicroKernel.IHandler[2]}
[0]: Model: {MySolution.Core.Interfaces.Services.IPersonManager}   
/ {MySolution.Area1.PersonManager} 

[1]: Model: {MySolution.Core.Interfaces.Services.IPersonManager} 
/ {MySolution.Area2.PersonManager} 
因此,我可以看到这两个实现都已注册

问题是,当我在网站上的区域2时,windsor正在解决区域1的接口实现,而不是区域2


看来温莎只是把第一个注册的还给了我。有没有办法返回基于MVC区域的正确实现?

< P>我会考虑这个问题。您可以检查当前的HTTP请求上下文,并“帮助”温莎决定使用哪个实现。

,我将为此考虑。您可以检查当前HTTP请求上下文并“帮助”windsor决定使用哪个实现。

同意Patrick的建议,下面是代码:

public class PersonManagerHandlerSelector : IHandlerSelector
{
    public bool HasOpinionAbout(string key, System.Type service)
    {
        return service == typeof (IPersonManager);
    }

    public IHandler SelectHandler(string key, System.Type service, 
                                                         IHandler[] handlers)
    {
        var dataTokens = System.Web.HttpContext.Current.Request.
                                          RequestContext.RouteData.DataTokens;
        if (dataTokens.Any())
        {
            var area = System.Web.HttpContext.Current.Request.RequestContext.
                                                   RouteData.DataTokens["area"];

            return !string.IsNullOrEmpty(area.ToString())
                       ? handlers.First(x => 
                                     x.ComponentModel.Name.Contains("." + area))
                       : handlers.First();
        }
        return handlers.First();
    }
}

按照Patrick的建议,代码如下:

public class PersonManagerHandlerSelector : IHandlerSelector
{
    public bool HasOpinionAbout(string key, System.Type service)
    {
        return service == typeof (IPersonManager);
    }

    public IHandler SelectHandler(string key, System.Type service, 
                                                         IHandler[] handlers)
    {
        var dataTokens = System.Web.HttpContext.Current.Request.
                                          RequestContext.RouteData.DataTokens;
        if (dataTokens.Any())
        {
            var area = System.Web.HttpContext.Current.Request.RequestContext.
                                                   RouteData.DataTokens["area"];

            return !string.IsNullOrEmpty(area.ToString())
                       ? handlers.First(x => 
                                     x.ComponentModel.Name.Contains("." + area))
                       : handlers.First();
        }
        return handlers.First();
    }
}