Model view controller Castle Windsor解决MVC区域接口的错误实现
我的解决方案的核心项目:IPersonManager中有一个接口,它有两个具体的实现,它们属于各自的项目 在我的web项目中,有一个表示这两个项目的MVC区域,每个区域中都有一个框架安装程序类,它将person manager类注册到每个区域中的接口,如下所示: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")
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();
}
}