gpt4 book ai didi

asp.net-mvc - 特定可移植区域的ControllerFactory

转载 作者:行者123 更新时间:2023-12-02 04:18:55 25 4
gpt4 key购买 nike

我的主要 ASP.NET MVC 复合应用程序使用全局 Unity 容器来注册类型。该应用程序将 Controller 工厂设置为使用此全局容器。我想重构这一点,以便我的每个可移植区域都利用它自己的子 Unity 容器,以便不同的区域可以以不同的方式实现接口(interface)。看来我需要每个区域有一个不同的 ControllerFactory 。鉴于以下内容为所有人设置了工厂,我将如何实现这一点?

ControllerBuilder.Current
.SetControllerFactory(/* controller factory with global unity container */);

最佳答案

您可以使用包含每个区域的所有 IControllerFactory 实现的 MasterControllerFactory,并知道哪个工厂可以构建哪个 RequestContext。这实际上允许您为任何变化选择不同的 ControllerFactory,而不仅仅是按区域。其工作原理如下:

所有区域 Controller 工厂实现都必须实现 IFilteredControllerFactory 而不是 IControllerFactory。这是:

public interface IFilteredControllerFactory:IControllerFactory
{
bool CanHandle(RequestContext requestContext);
}

根据区域名称进行过滤的实现示例如下所示:

public class Area51ControllerFactory:IFilteredControllerFactory
{
public bool CanHandle(RequestContext requestContext)
{
return requestContext.RouteData.DataTokens["area"].ToString().ToLowerInvariant() == "area51";
}
public IController CreateController(RequestContext requestContext, string controllerName)
{
// create a controller...
}

public void ReleaseController(IController controller)
{
// release the controller...
}

}

然后你需要MasterControllerFactory,它看起来像这样:

public class MasterControllerFactory : DefaultControllerFactory
{
private readonly List<IFilteredControllerFactory> _slaveFactories;
public MasterControllerFactory()
{
_slaveFactories = new List<IFilteredControllerFactory>();
}
public void RegisterFactory(IFilteredControllerFactory slaveFactory)
{
if(slaveFactory!=null && !_slaveFactories.Contains(slaveFactory))
{
_slaveFactories.Add(slaveFactory);
}
}

public override IController CreateController(RequestContext requestContext, string controllerName)
{
var factory = _slaveFactories.FirstOrDefault(x => x.CanHandle(requestContext));
if(factory!=null)
{
return factory.CreateController(requestContext, controllerName);
}
return base.CreateController(requestContext, controllerName);
}

public override void ReleaseController(IController controller)
{
bool released = false;
if (controller is Controller)
{
var requestContext = ((Controller) controller).ControllerContext.RequestContext;
var factory = _slaveFactories.FirstOrDefault(x => x.CanHandle(requestContext));
if (factory != null)
{
factory.ReleaseController(controller);
released = true;
}
}
if(!released)base.ReleaseController(controller);
}
}

global.asax 的 Application_Start 中,您仍然需要设置所有内容,但这很简单。

var masterControllerFactory = new MasterControllerFactory();
masterControllerFactory.Register(new Area51ControllerFactory());
ControllerBuilder.Current.SetControllerFactory(masterControllerFactory);

显然,您可以通过多种方式进行调整,以最好地适应您的编码风格和应用程序架构。

关于asp.net-mvc - 特定可移植区域的ControllerFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5345581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com