爱上MVC~一个Action多套View模版的设计
2018-06-22 06:05:36来源:未知 阅读 ()
回到目录
模块化
这个问题是在做模块化设计时出现的,在Lind.DDD.Plugins模块里,需要对应的模块实体,模块管理者,模块标识接口等,开发时,如果你的功能点属于一个模块,需要实现IPlugins,而当实现了标识接口后,在应用程序启动时,会一次性将所有插件模块注册到你的系统里,在需要使用时,只要使用PluginManager管理者把对应的模块取出来即可,这个取出的过程是没有性能损耗的,它并不是反射!
更多Lind.DDD.Plugins的相关知识,请阅读大叔这篇文章《Lind.DDD.Plugins~插件模式的集成》
模块化在UI层的体现
本文主要问题是在设计出多个模块是,在UI层如何根据选中的模块,渲染出不同的VIEW来,这个问题不是新技术,只需要使用Html.Partial这个扩展方法即可以实现,而大叔要说的是,我们设计模块时,应该把所有模块放在一个统一的目录,新来的模块View只要放到module即可,由于模块核心内容都写在对应的module中,controller/action变得更加轻薄,这时,我们很容易使用autofac这些IoC工具把需要的模块对象动态生产出来,这也是Lind.DDD.Plugins要做的事情,只不过,为了性能考虑,我们在程序启动时已经把所有模块注册了,对于核心业务的action,所有模块共用一个即可,如列表action使用Index,添加action使用Create,而controller我们使用比较公用的名称,如商品管理Product,订单管理Order,而具体的手机项目product和order及PC端的product和order完全在对应的module里去实现(逻辑上的实现),而它们的action只会路由的转发,即根据项目去选择渲染哪一个View。
WEB MVC下面Module的组成
程序启动时注册Module这个特殊的路由模块,让我们的mvc程序可以找个Module下面的Views,这个只对需要有具体Action时用,如果你的module只有view,action都有公用模块实现了,就不需要注册下面代码了!
/// <summary> /// 注册模块 /// </summary> public class Module_routing : RazorViewEngine { public Module_routing() { //视图位置 ViewLocationFormats = new[] { "~/Views/{1}/{0}.cshtml", "~/Views/Module/{1}/{0}.cshtml" }; //分部视图位置 PartialViewLocationFormats = new[] { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml", "~/Views/Module/Shared/{0}.cshtml", "~/Views/Module/{1}/{0}.cshtml" }; } public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) { return base.FindView(controllerContext, viewName, masterName, useCache); } public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache) { return base.FindPartialView(controllerContext, partialViewName, useCache); } }
在程序启动时,把它的实例注册进来
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); RegisterView_Custom_routing(); } protected void RegisterView_Custom_routing() { ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new Module_routing()); }
而在公用的action里,一般来说,会接收一个moduleName或者ModuleId这种属性,然后生产对应的模块对象,把对象的结果传给对应的View即可。
public ActionResult Index(string module) { var model=Plugins.PluginManager.Resolve<IShop>("module").GetModel();//这个地方不是反射,只是从容器里把对应的实例取出来 return View(model); }
在主View上进行渲染对应项目的PartialView,同时把Model传给对应的View,一般代码如下
<ul> <li>@Html.ActionLink("pc端", "index", new { module = "pc" })</li> <li>@Html.ActionLink("h5端", "index", new { module = "h5" })</li> <li>@Html.ActionLink("pad端", "index", new { module = "pad" })</li> </ul> @Html.Partial("~/views/module/"+Request.QueryString["module"] + "/index.cshtml",Model) <!-- 渲染对应的模块下的页面,Model由公用action返回 -->
这样产生的好处就是,当你添加新的module时,只需要维护对应的Project即可,然后把主网站的Views/Module文件夹更新,同时在module数据表中添加新的模块,就实现的新模块对老项目的集成!这一切可以说与原项目是解耦合的,它们可以在不同的解决方案中完成,各自负责各位的业务逻辑!
感谢各位对大叔框架的支持!
同时希望大家多多支持咱们.Net跨平台社区,支持善友大牛!
回到目录
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Asp.net MVC SignalR来做实时Web聊天实例代码 2020-03-29
- ASP.NET MVC中jQuery与angularjs混合应用传参并绑定数据 2020-03-29
- ASP.NET MVC Admin主页快速构建 2020-03-23
- Asp.Net MVC4通过id更新表单内容的思路详解 2020-03-19
- MVC数据验证详解 2020-03-14
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash