1

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

在我的 Web 项目中,有一个 MVC 区域代表这两个项目,并且每个区域都有一个框架安装程序类,它将人员管理器类注册到每个区域的接口,如下所示:

 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} 

所以我可以看到两个实现都已注册。

问题是当我在网站上的Area2 时,windsor 正在解析Area1 的接口实现而不是Area2。

好像温莎只是把最先注册的那个还给我。有没有办法根据 MVC 区域取回正确的实现?

4

2 回答 2

1

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

于 2012-11-26T22:57:02.013 回答
0

接受帕特里克的建议,这是代码:

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();
    }
}
于 2012-11-27T15:27:00.380 回答