你的位置:首页 > 软件开发 > ASP.net > 全面解析ASP.NET MVC模块化架构方案

全面解析ASP.NET MVC模块化架构方案

发布时间:2016-03-28 18:00:09
什么叫架构?揭开架构神秘的面纱,无非就是:分层+模块化。任意复杂的架构,你也会发现架构师也就做了这两件事。 本文将会全面的介绍我们团队在模块化设计方面取得的经验。之所以加了“全面”二字,是因为本文的内容将会涉及到:数据库、路由、C#、J ...

什么叫架构?揭开架构神秘的面纱,无非就是:分层+模块化。任意复杂的架构,你也会发现架构师也就做了这两件事。

 

本文将会全面的介绍我们团队在模块化设计方面取得的经验。之所以加了“全面”二字,是因为本文的内容将会涉及到:数据库、路由、C#、JavaScript、CSS、HTML等一个完整模块所需要的内容。

 

在阅读本文之前后,你也可以转到我们的开源项目:https://github.com/leotsai/get='_blank'>mvcsolution。这个开源项目完整的总结了我们团队在ASP.NET MVC领域的分层架构思想,同时也定义了很多标准。

 

本文的目的则主要是介绍架构思想之模块化。

 

当前项目架构以及模块化架构图

一个模块的运行通常要依托于一个完整的系统。在本文的例子中,模块化依托于我们的开源项目MvcSolution这个架构。下面先看看这个架构的工程引用关系图:

全面解析ASP.NET MVC模块化架构方案

 

上面这个架构是系统原本的架构,而在这个原本的架构之上,我们怎么添加模块的呢?请看下图:

全面解析ASP.NET MVC模块化架构方案

 

从上图可以看出,我们增加的模块是引用了系统原来的多个工程的,这虽然会增加模块与当前系统的耦合度,但是却让模块的开发变得简单很多。而对于我们团队来讲,因为所有项目都是基于MvcSolution这个架构,所以每一个模块都可以很快的融入每一个系统。

 

下面在看看添加了模块之后的项目文件结构:

 

全面解析ASP.NET MVC模块化架构方案

 

由于我们这个模块不算大,所以就把所有C#文件都放到一个工程里面了,分层只在心中。这也有利于我们将这个模块搬运到其他项目中。

 

1. 模块的入口 

我们模块的入口非常简单,没有反射,也没有动态初始化,就是一个再普通不过的System.Web.MvcAreaRegistration。 在Global.ascx.cs文件中,通过AreaRegistration.RegisterAllAreas();把所有引用的Area全部注册。

 

在这个AreaRegistration类中,主要完成了路由的注册以及IOC的注册,如下图:

全面解析ASP.NET MVC模块化架构方案

 

这样,这个模块的公开URL地址就已经生成了,如:http://www.example.com/donating。你可以在程序其他地方添加这个链接,那么用户就可以访问这个模块了。

 

2. 模块化之数据访问

模块内的数据访问如何跟现有系统的数据访问共存,这个问题是所有模块化架构师最难处理的问题,相比其他文件(C#、JS、CSS、HTML),数据访问最难处理好,因为下面这个目标很难达到:

目标:模块内可以很轻易的访问现有数据库的所有内容,但是却最好不对现有数据库进行任何更改,只有这样,当该模块移除之后,才不会留下任何无用的代码;

 

在我们的实践当中,基本上可以达到这个目标。下面我就详细介绍我们是如何进行数据访问设计的,基于EF CodeFirst。

 

原有系统使用着一个非常复杂且庞大的数据库,我们希望新增加的模块不做任何更改。原有数据库大概长这个样子的:

全面解析ASP.NET MVC模块化架构方案

 

我们增加的模块化工程的文件结构如下图:

全面解析ASP.NET MVC模块化架构方案

 

我们是增加了一个新的数据库DonatingDataContext,当然,这个数据库继承自原有系统的数据库。这样,新增加的模块就可以完全访问原有数据库了。请看模块数据库代码:

全面解析ASP.NET MVC模块化架构方案全面解析ASP.NET MVC模块化架构方案
 1 namespace Lin.Plugins.Donating.Data 2 { 3   public class DonatingDataContext : LinDataContext 4   { 5     public DbSet<DonateComment> DonateComments { get; set; }  6     public DbSet<DonatePost> DonatePosts { get; set; } 7     public DbSet<DonateWant> DonateWants { get; set; } 8  9     public DonatingDataContext()10     {11       Database.SetInitializer<DonatingDataContext>(null);12     }13 14     protected override void OnModelCreating(DbModelBuilder modelBuilder)15     {16       base.OnModelCreating(modelBuilder);17       var mappings = typeof(DonatingDataContext).Assembly.GetInheritedTypes(typeof(EntityTypeConfiguration<>));18       foreach (var mapping in mappings)19       {20         dynamic instance = Activator.CreateInstance(mapping);21         modelBuilder.Configurations.Add(instance);22       }23     }24   }25 }

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:全面解析ASP.NET MVC模块化架构方案

关键词:ASP.NET

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。