扩展ASP.NET MVC三层框架并使用StructureMap实现依赖注入1

转载 2013年04月04日 21:31:20

今天开始天屹将给大家分享一个扩展的ASP.NET MVC三层框架,并使用StructureMap实现依赖注入,充分的使代码之间的耦合度降到最低。由于时间精力有限天屹无法在一篇文章中全部介绍完,将把文章写成一个系列文章。系统将使用最新的MVC4和EntityFramework5.0。众所周知MVC4新建的默认工程很简单,而且Model层是和Views,Controller在一个Project里面的,这样的结构很不美观也很不利于维护,最重要的一点没有Service层和Repository层。

本篇文章将向大家介绍如何添加Service和Repository层并且使用StructureMap把Service层注入到Controller,把Repository注入到Service层。Service层主要是我们的业务逻辑层,这一层不和底层的Database打交道,和Database打交道的是Repository数据持久层。本篇文章通过使用StructureMap依赖注入使Controller,Service,Repository三层的耦合度降到最低。

本系统使用NorthWind开源数据,并且使用EntityFramework5.0实现对数据库的Object映射。

开始正题之前先来看一下成型的框架结构,我们将围绕这个截图进行展开。

mvc-customized-framework

 

 

 

 

 

首先我们看TYStudioDemo.Models这个Project里面的内容

mvc-customized-framework

这里面有我们的EntityFramwork的edmx文件,Northwind的数据库表映射的对象集合。这里建立ADO.Net Entity Data Model的时候没有使用默认生成一堆.tt文件的方式,而是使用了老的形式。实现方法是首先按默认程序建立起data model,建立好data model之后删除.tt文件。然后打开.edmx文件,右键单击空白处选择Properties(属性),会出现下面的截图,这时候只需要修改一下Code Generation Strategy(中文翻译不知道是什么,第一个就对了)的值,默认是None,我们修改为Default,然后保存.edmx,ok,万事大吉。

edmx-propertoties

你应该已经注意到了,项目里多了一个TYEntities.cs文件,这个我们是我们这个系统中实现Transaction(事务处理)的关键。
我们使用static和[ThreadStatic]属性来保证一个线程拿到的TYEntities(ObjectContext)总是同一个,这就解决了Transaction事务的问题。没有解释到的请详细阅读下面代码里面的注释。  

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 using System.Web;
  7 
  8 namespace TYStudioDemo.Models
  9 {
 10     public partial class TYEntities
 11     {
 12         #region Fields
 13 
 14         //定义索引名称
 15         const string ContextKey = "TYEntities";
 16 
 17         //标记为ThreadStaticAttribute的静态字段不在线程之间共享。
 18         //每个执行线程都有单独的字段实例,并且独立地设置及获取该字段的值。如果在不同的线程中访问该字段,则该字段将包含不同的值。
 19         [ThreadStatic]
 20         private static TYEntities _current;
 21 
 22         #endregion
 23 
 24         #region Properties
 25 
 26         public bool Disposed { get; set; }
 27 
 28         /// <summary>
 29         /// 当系统工作在HttpContext下,将使用延迟家在技术返回一个TYEntities(ObjectContext),如果没有HttpContext将返回null
 30         /// 
 31         /// 不论在哪里使用TYEntities,在请求结束后都需要调用TYEntities.Cleanup()方法
 32         /// 最佳的方式是TYEntities.Cleanup()放到Global.asax.cs文件里面。
 33         /// void Application_EndRequest(object sender, EventArgs e)
 34         /// {
 35         ///     TYStudioDemo.Models.TYEntities.Cleanup();
 36         /// }
 37         /// </summary>
 38         private static TYEntities ForWebRequest
 39         {
 40             get
 41             {
 42                 var context = HttpContext.Current;
 43 
 44                 //检查HttpContext是否存在
 45                 if (context != null)
 46                 {
 47                     //试着从context中得到TYEntities
 48                     var result = context.Items[ContextKey] as TYEntities;
 49 
 50                     if (result == null)
 51                     {
 52                         //创建新的datacontext,并且保存到context里面
 53                         result = new TYEntities();
 54                         context.Items[ContextKey] = result;
 55                     }
 56 
 57                     return result;
 58                 }
 59 
 60                 return null;
 61             }
 62         }
 63 
 64         /// <summary>
 65         /// 这是一个用来获取TYEntities(ObjectContext)的公共属性
 66         /// 
 67         /// 如果你通过HttpContext获取TYEntities,同样不论在哪里使用TYEntities,在请求结束后都需要调用TYEntities.Cleanup()方法
 68         /// 
 69         /// 如果没有通过HttpContext获取TYEntities,你必须在使用结束之后调用TYEntities.Cleanup()方法,来清理ObjectContext。
 70         /// 
 71         /// 需要注意的一点是,无论使用哪种方式获取TYEntities,我们都必须手动的清理和Dispose TYEntities(ObjectContext)。
 72         /// 所以一定不要在using块中使用TYEntities(ObjectContext)。
 73         /// </summary>
 74         public static TYEntities Current
 75         {
 76             get
 77             {
 78                 //从HttpContext中获取datacontext
 79                 var result = TYEntities.ForWebRequest;
 80 
 81                 if (result != null)
 82                     return result;
 83 
 84                 //试着获取当前活动的TYEntities
 85                 if (_current == null)
 86                     _current = new TYEntities();
 87 
 88                 return _current;
 89             }
 90         }
 91 
 92         /// <summary>
 93         /// 清理结束TYEntities(ObjectContext)
 94         /// </summary>
 95         public static void Cleanup()
 96         {
 97             if (HttpContext.Current != null)
 98             {
 99                 var result = HttpContext.Current.Items[ContextKey] as TYEntities;
100 
101                 if (result != null)
102                     result.Dispose();
103 
104                 HttpContext.Current.Items[ContextKey] = null;
105             }
106             else if (_current != null)
107             {
108                 _current.Dispose();
109                 _current = null;
110             }
111         }
112 
113 
114         protected override void Dispose(bool disposing)
115         {
116             bool disposed = Disposed;
117             Disposed = true;
118 
119             if (!disposed)
120                 Cleanup();
121 
122             base.Dispose(disposing);
123         }
124 
125         #endregion
126     }
127 }

由于时间问题,今天就先介绍TYStudio.Models的实现。在以后的文章中会陆续介绍各个Project的内容,所有Project介绍完之后,会在工程中加入日志和异常的处理,我们使用EnterPrise Library来实现他们。同时也会把天屹前段时间写的MVC4 Simplemembership权限管理的系统集成进来。

天屹一定抽出时间会尽快更新完成这一系列的文章,全部文章结束之后天屹会公开分享系统的代码供大家下载。

如果觉得文章内容还行,请点一下推荐,让更多的人看见,天屹会有更多的动力写下去,并且完善系统。原创文章转载请注明出处,谢谢。

相关文章

 


<script type="text/javascript"><!-- google_ad_client = "ca-pub-1944176156128447"; /* cnblogs 首页横幅 */ google_ad_slot = "5419468456"; google_ad_width = 728; google_ad_height = 90; //--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

扩展ASP.NET MVC三层框架并使用StructureMap实现依赖注入1-Model层的实现

今天开始天屹将给大家分享一个扩展的ASP.NET MVC三层框架,并使用StructureMap实现依赖注入,充分的使代码之间的耦合度降到最低。由于时间精力有限天屹无法在一篇文章中全部介绍完,将把文章...

使用StructureMap扩展ASP.NET MVC三层结构框架系列文章总结篇(附源码下载)

本系统提供一个对默认的ASP.NET MVC扩展的三层结构框架,使用了StructureMap和Enterprise Library进行依赖注入和异常日志记录处理,面向接口编程在本系统得到了充分的体现...

【MVC整理】1.使用 StructureMap 作为 ASP.NET MVC 的 DI 框架

StructureMap 是一个非常灵巧的IOC框架,与asp.net MVC 更是很好的集成。 准备: 下载StructureMap,基本实例中只需要引用StructureMap.dll文件,并...

【ASP.Net MVC3 】使用Unity 实现依赖注入

什么是Unity? Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入。Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问题。构建一个成功应用程序的关键是实...

ASP.NET MVC 3让依赖注入实现得更简单

昨天,我写了一篇文章(参见:ASP.NET MVC 依赖注入),这种实现方式我个人一直感觉不太顺,在写出来与大家一起分享的同时, 也是想让大家提提自己的建议, 今天下载了微软发布的最新的ASP.NE...

ASP.NET MVC 3让依赖注入实现得更简单

昨天,我写了一篇文章(参见:ASP.NET MVC 依赖注入),这种实现方式我个人一直感觉不太顺,在写出来与大家一起分享的同时, 也是想让大家提提自己的建议, 今天下载了微软发布的最新的ASP.NE...
  • xxglyy
  • xxglyy
  • 2012年09月10日 21:50
  • 424

理解ASP.NET MVC的DependencyResolver组件 (依赖注入)

转 http://www.cnblogs.com/xiaoxiaojia/p/5362356.html 一、前言    DependencyResolver是MVC中一个重要的组件,从名字可以看...

ASP.NET MVC5+EF6+EasyUI 后台管理系统(6)-Unity 依赖注入

系列目录 前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 本节重构一下代码,采用IOC控制反转,也就是依赖注入 您可以访问http://unity.codeplex.c...
  • ymnets
  • ymnets
  • 2017年11月29日 08:38
  • 33

ASP.NET MVC3 让依赖注入来的更简单(新补充了Ninject示例)

昨天,我写了一篇文章(参见:ASP.NET MVC 依赖注入),这种实现方式我个人一直感觉不太顺,在写出来与大家一起分享的同时, 也是想让大家提提自己的建议, 今天下载了微软发布的最新的 ASP...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:扩展ASP.NET MVC三层框架并使用StructureMap实现依赖注入1
举报原因:
原因补充:

(最多只允许输入30个字)