热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

EasyMvc让MVC区域开发更Easy(提供源码下载)

核心:主要利用MVC的区域功能,实现项目模块独立开发和调试。目标:各个模块以独立MVC应用程序存在,即模块可独立开发和调试。动态注册各个模块路由。一:新建解决方案目录结构如图:二:

核心:

主要利用MVC的区域功能,实现项目模块独立开发和调试。

目标:

各个模块以独立MVC应用程序存在,即模块可独立开发和调试。

动态注册各个模块路由。

一:新建解决方案目录结构

如图:

 技术分享

二:EasyMvc.Core即为核心库。

核心库三大主力:AreaConfig 、RouteConfig 、FilterConfig

AreaConfig :为区域启动停止以及其他状态时注入的方法,类似与Global.asax里面Application_Start、Application_End方法。

RouteConfig :路由方法,类似与App_Start里面RouteConfig方法。

FilterConfig:区域全局过滤器,针对当前路区域所有控制器的过滤(未实现)。

AreaConfig.cs

    public class AreaConfig
    {
        public virtual void Area_Start()
        {

        }
        public virtual void Area_End()
        {

        }
    }

RouteConfig.cs

    public class RouteConfig
    {
        public virtual void RegisterRoutes(AreaRoute routes)
        {
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { cOntroller= "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
        public virtual void RegisterRoutes(RouteCollection routes)
        {
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { cOntroller= "Home", action = "Index", id = UrlParameter.Optional }
            );
        }

        private static Dictionary<string, RouteBase> _routes = new Dictionary<string, RouteBase>();
        private static Dictionary<string, RouteConfig> _areas = new Dictionary<string, RouteConfig>();

        #region Fields
        public string Name { get; set; }
        public string Path { get; set; }
        public string[] NameSpaces { get; set; }
        #endregion

        #region Route
        public string FormatName(string name)
        {
            if (string.IsNullOrEmpty(name))
                throw new RouteException("路由名称为空", Name);
            return string.Format("{0}_{1}", Name, name);
        }
        public string FormatUrl(string url)
        {
            if (string.IsNullOrEmpty(url))
                throw new RouteException("路由地址为空", Name);
            return string.Format("{0}/{1}", Path, url);
        }
        public string[] FormatNameSpaces(string[] namespaces)
        {
            if (namespaces != null && namespaces.Length > 0)
            {
                List<string> list = NameSpaces == null ? (new List<string>()) : NameSpaces.ToList();
                foreach (var item in namespaces)
                {
                    if (!list.Contains(item))
                        list.Add(item);
                }
                NameSpaces = list.ToArray();
            }
            return null;
        }
        public void AddRoute(string routeName, RouteBase route)
        {
            if (!string.IsNullOrEmpty(routeName) && route != null)
                _routes.Add(routeName, route);
        }

        public void CheckName(string routeName)
        {
            if (_routes.Any(op => op.Key == routeName))
                throw new RouteException("路由名称已存在", Name, routeName);
        }
        #endregion

        #region Area
        public void Init()
        {
            Regist(RouteTable.Routes);
        }
        private void Regist(RouteCollection routes)
        {
            if (_areas.ContainsKey(Name))
                throw new AreaExcption("区域已存在", Name);
            _areas[Name] = this;
            AreaRegistrationContext context = new AreaRegistrationContext(Name, routes);
            AddNameSpaces(context);
            RegisterArea(context);
            if (Config.MConfig.IsDebug)
            {
                RegisterRoutes(routes);
            }
        }
        private void AddNameSpaces(AreaRegistrationContext context)
        {
            if (NameSpaces != null && NameSpaces.Length > 0)
                foreach (string item in NameSpaces)
                {
                    context.Namespaces.Add(item);
                }
        }
        private void RegisterArea(AreaRegistrationContext context)
        {
            AreaRoute route = new AreaRoute(this, context);
            RegisterRoutes(route);
        }
        #endregion
    }

FilterConfig.cs(未实现)

  public class FilterConfig { } 

三:模块重写三大核心类

技术分享

App_Satrt下面的几个类,就是重写EasyMvc.Core的三大核心类的了。

AreaConfig.cs
    public class AreaConfig : EasyMvc.Core.AreaConfig
    {
        public override void Area_Start()
        {

        }
        public override void Area_End()
        {

        }
    }
RouteConfig.cs
    public class RouteConfig : EasyMvc.Core.RouteConfig
    {
        public override void RegisterRoutes(EasyMvc.Core.Routes.AreaRoute routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { cOntroller= "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
        public override void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { cOntroller= "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }

FilterConfig.cs

  public class FilterConfig : EasyMvc.Core.FilterConfig { } 

四:模块配置

主项目和各个模块都可配置Module.config

"1.0" encoding="utf-8"?>

  false
  
    ModuleOne
    ModuleOne.AreaConfig
    ModuleOne.RouteConfig
    
    ModuleOne
    A
    
      <string>ModuleOne.Controllersstring>
    
  
  
    ModuleTwo
    ModuleTwo.AreaConfig
    ModuleTwo.RouteConfig
    
    ModuleTwo
    B
    
      <string>ModuleTwo.Controllersstring>
    
  
  
    MvcApplication1
    MvcApplication1.AreaConfig
    MvcApplication1.RouteConfig
    
    Test
    C
    
      <string>MvcApplication1.Controllersstring>
    
  

EasyMvc.Core AreaApplication会根据配置动态初始化执行区域方法以及各个区域的路由注册等工作。

另外AreaViewEngines会根据配置动态设置视图查找路径。

最后效果:

技术分享

技术分享

技术分享

更多东西请查看源码,源码下面提供下载。

源码地址:http://files.cnblogs.com/files/deeround/EasyMvc.rar

EasyMvc--让MVC区域开发更Easy(提供源码下载)


推荐阅读
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文介绍了 AngularJS 中的 $compile 服务及其用法,通过示例代码展示了如何使用 $compile 动态编译和链接 HTML 元素。 ... [详细]
  • 系统数据实体验证异常:多个实体验证失败的错误处理与分析
    在使用MVC和EF框架进行数据保存时,遇到了 `System.Data.Entity.Validation.DbEntityValidationException` 错误,表明存在一个或多个实体验证失败的情况。本文详细分析了该错误的成因,并提出了有效的处理方法,包括检查实体属性的约束条件、调试日志的使用以及优化数据验证逻辑,以确保数据的一致性和完整性。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 在 iOS 开发中,经常会遇到 `@(YES)`、`@[firstViewController]` 以及 `@{@a:@b}` 这样的语法糖。这些简化的写法分别用于初始化布尔值、数组和字典对象,能够显著提高代码的可读性和编写效率。例如,`@(YES)` 可以快速创建一个布尔值对象,`@[firstViewController]` 则用于创建包含单个元素的数组,而 `@{@a:@b}` 则用于创建键值对字典。理解这些语法糖的使用方法,有助于开发者更加高效地进行编码。 ... [详细]
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • AngularJS 进阶指南:第三部分深入解析
    在本文中,我们将深入探讨 AngularJS 的指令模型,特别是 `ng-model` 指令。`ng-model` 指令用于将 HTML 元素与应用程序数据进行双向绑定,支持多种数据类型验证,如数字、电子邮件地址和必填项检查。此外,我们还将介绍如何利用该指令优化表单验证和数据处理流程,提升开发效率和用户体验。 ... [详细]
  • 在探讨Hibernate框架的高级特性时,缓存机制和懒加载策略是提升数据操作效率的关键要素。缓存策略能够显著减少数据库访问次数,从而提高应用性能,特别是在处理频繁访问的数据时。Hibernate提供了多层次的缓存支持,包括一级缓存和二级缓存,以满足不同场景下的需求。懒加载策略则通过按需加载关联对象,进一步优化了资源利用和响应时间。本文将深入分析这些机制的实现原理及其最佳实践。 ... [详细]
  • 网络爬虫的规范与限制
    本文探讨了网络爬虫引发的问题及其解决方案,重点介绍了Robots协议的作用和使用方法,旨在为网络爬虫的合理使用提供指导。 ... [详细]
  • [c++基础]STL
    cppfig15_10.cppincludeincludeusingnamespacestd;templatevoidprintVector(constvector&integer ... [详细]
  • 自动验证时页面显示问题的解决方法
    在使用自动验证功能时,页面未能正确显示错误信息。通过使用 `dump($info->getError())` 可以帮助诊断和解决问题。 ... [详细]
  • 装饰者模式(Decorator):一种灵活的对象结构设计模式
    装饰者模式(Decorator)是一种灵活的对象结构设计模式,旨在为单个对象动态地添加功能,而无需修改原有类的结构。通过封装对象并提供额外的行为,装饰者模式比传统的继承方式更加灵活和可扩展。例如,可以在运行时为特定对象添加边框或滚动条等特性,而不会影响其他对象。这种模式特别适用于需要在不同情况下动态组合功能的场景。 ... [详细]
  • 本项目通过Python编程实现了一个简单的汇率转换器v1.02。主要内容包括:1. Python的基本语法元素:(1)缩进:用于表示代码的层次结构,是Python中定义程序框架的唯一方式;(2)注释:提供开发者说明信息,不参与实际运行,通常每个代码块添加一个注释;(3)常量和变量:用于存储和操作数据,是程序执行过程中的重要组成部分。此外,项目还涉及了函数定义、用户输入处理和异常捕获等高级特性,以确保程序的健壮性和易用性。 ... [详细]
  • 本文详细解析了Autofac在高级应用场景中的具体实现,特别是如何通过注册泛型接口的类来优化依赖注入。示例代码展示了如何使用 `builder.RegisterAssemblyTypes` 方法,结合 `typeof(IEventHandler).Assembly` 和 `Where` 过滤条件,动态注册所有符合条件的类,从而简化配置并提高代码的可维护性。此外,文章还探讨了这一方法在复杂系统中的实际应用及其优势。 ... [详细]
  • VS2019 在创建 Windows 恢复点时出现卡顿问题及解决方法
    在使用 Visual Studio 2019 时,有时会在创建 Windows 恢复点时遇到卡顿问题。这可能是由于频繁的自动更新导致的,每次更新文件大小可能达到 1-2GB。尽管现代网络速度较快,但这些更新仍可能对系统性能产生影响。本文将探讨该问题的原因,并提供有效的解决方法,帮助用户提升开发效率。 ... [详细]
author-avatar
enlend_443
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有