asp.net-mvc – 特定便携式区域的ControllerFactory
发布时间:2020-05-27 09:20:26 所属栏目:asp.Net 来源:互联网
导读:我的主要ASP.NET MVC组合应用程序使用全局Unity容器来注册类型.该应用程序将控制器工厂设置为使用此全局容器.我想重构这一点,以便我的每个可移植区域都利用它自己的子Unity容器,以便不同的区域可以以不同的方式实现接口.看起来每个区域需要一个不同的Controll
|
我的主要ASP.NET MVC组合应用程序使用全局Unity容器来注册类型.该应用程序将控制器工厂设置为使用此全局容器.我想重构这一点,以便我的每个可移植区域都利用它自己的子Unity容器,以便不同的区域可以以不同的方式实现接口.看起来每个区域需要一个不同的ControllerFactory.我将如何实现这一目标,因为以下内容为所有人设置工厂? ControllerBuilder.Current
.SetControllerFactory(/* controller factory with global unity container */);
解决方法您可以使用包含每个区域的所有IControllerFactory实现的MasterControllerFactory,并知道哪个工厂可以构建哪个RequestContext.这实际上允许您为任何变体选择不同的ControllerFactory,而不仅仅是按区域.以下是它的工作原理:所有区域控制器工厂实现必须实现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 – 使用ViewModels,EditModels和AutoMapper参考
- asp.net – 如何在Azure网站上禁用SSL v 3.0
- asp.net-mvc – Visual Studio 2010 Full和ASP.NET MVC 2.0
- asp.net-mvc – MVC ViewModel绑定构造与展平
- asp.net – 使用HttpRequestMessage.Properties传递每个请求
- asp.net – 在web.config location元素中无法识别InheritIn
- asp.net-mvc – 从ASP.NET MVC操作返回什么来允许jQuery aj
- asp.net – 在Web.config帮助中定义tagPrefixes
- asp.net – Panel visible = true没有任何效果
- asp.net-mvc – 以表格形式上传图片并在MVC 4上显示
推荐文章
站长推荐
- asp.net-mvc – ASP.NET MVC:通过两个控制器操作
- asp.net – 找不到指定文化或中性文化的任何资源
- asp.net-mvc – 在ASP.NET MVC中获取当前操作/控
- asp.net – WebFormsMVP的缺点?
- entity-framework – 管理dbContext的生命周期
- asp.net-mvc – 如何在ASP.NET MVC视图中使用扩展
- asp.net-mvc – 在web.config文件中创建自定义变
- asp.net – 如何在Linux服务器上安装mono?
- asp.net – 在JavaScript中访问asp:hiddenfield
- 数据注释 – MVC3中的ModelState.IsValid vs IVa
热点阅读
