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

2014-05-18  来源:本站原创  分类:实用技巧  人气:3 

本篇文章将向大家介绍如何添加Service和Repository层并且使用StructureMap把Service层注入到Controller,把Repository注入到Service层。

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

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

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

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

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

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

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

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

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

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Web;

 namespace TYStudioDemo.Models
 {
     public partial class TYEntities
     {
         #region Fields

         //定义索引名称
         const string ContextKey = "TYEntities";

         //标记为ThreadStaticAttribute的静态字段不在线程之间共享。
         //每个执行线程都有单独的字段实例,并且独立地设置及获取该字段的值。如果在不同的线程中访问该字段,则该字段将包含不同的值。
         [ThreadStatic]
         private static TYEntities _current;

         #endregion

         #region Properties

         public bool Disposed { get; set; }

         /// <summary>
         /// 当系统工作在HttpContext下,将使用延迟家在技术返回一个TYEntities(ObjectContext),如果没有HttpContext将返回null
         ///
         /// 不论在哪里使用TYEntities,在请求结束后都需要调用TYEntities.Cleanup()方法
         /// 最佳的方式是TYEntities.Cleanup()放到Global.asax.cs文件里面。
         /// void Application_EndRequest(object sender, EventArgs e)
         /// {
         ///     TYStudioDemo.Models.TYEntities.Cleanup();
         /// }
         /// </summary>
         private static TYEntities ForWebRequest
         {
             get
             {
                 var context = HttpContext.Current;

                 //检查HttpContext是否存在
                 if (context != null)
                 {
                     //试着从context中得到TYEntities
                     var result = context.Items[ContextKey] as TYEntities;

                     if (result == null)
                     {
                         //创建新的datacontext,并且保存到context里面
                         result = new TYEntities();
                         context.Items[ContextKey] = result;
                     }

                     return result;
                 }

                 return null;
             }
         }

         /// <summary>
         /// 这是一个用来获取TYEntities(ObjectContext)的公共属性
         ///
         /// 如果你通过HttpContext获取TYEntities,同样不论在哪里使用TYEntities,在请求结束后都需要调用TYEntities.Cleanup()方法
         ///
         /// 如果没有通过HttpContext获取TYEntities,你必须在使用结束之后调用TYEntities.Cleanup()方法,来清理ObjectContext。
         ///
         /// 需要注意的一点是,无论使用哪种方式获取TYEntities,我们都必须手动的清理和Dispose TYEntities(ObjectContext)。
         /// 所以一定不要在using块中使用TYEntities(ObjectContext)。
         /// </summary>
         public static TYEntities Current
         {
             get
             {
                 //从HttpContext中获取datacontext
                 var result = TYEntities.ForWebRequest;

                 if (result != null)
                     return result;

                 //试着获取当前活动的TYEntities
                 if (_current == null)
                     _current = new TYEntities();

                 return _current;
             }
         }

         /// <summary>
         /// 清理结束TYEntities(ObjectContext)
         /// </summary>
         public static void Cleanup()
         {
             if (HttpContext.Current != null)
             {
                 var result = HttpContext.Current.Items[ContextKey] as TYEntities;

                 if (result != null)
                     result.Dispose();

                 HttpContext.Current.Items[ContextKey] = null;
             }
             else if (_current != null)
             {
                 _current.Dispose();
                 _current = null;
             }
         }

         protected override void Dispose(bool disposing)
         {
             bool disposed = Disposed;
             Disposed = true;

             if (!disposed)
                 Cleanup();

             base.Dispose(disposing);
         }

         #endregion
     }
 }
相关文章
  • 扩展ASP.NET MVC三层框架且使用StructureMap实现依赖注入1-Model层 2014-05-18

    本篇文章将向大家介绍如何添加Service和Repository层并且使用StructureMap把Service层注入到Controller,把Repository注入到Service层. 本篇文章将向大家介绍如何添加Service和Repository层并且使用StructureMap把Service层注入到Controller,把Repository注入到Service层.Service层主要是我们的业务逻辑层,这一层不和底层的Database打交道,和Database打交道的是Repos

  • ASP.NET MVC+EF框架+EasyUI实现权限管系列 2014-06-26

    在学习MVC之前,我们有必要知道这些知识点(自动属性,隐式类型var,对象初始化器和集合初始化器,匿名类,扩展方法,Lambda表达式),如果你还不知道的话就请看我下面的简单的介绍,看下面我建立的项目的初步图像,然后下篇我们开始简单的介绍. 前言:本文开始我们便一步一步的来实现这个权限系统的初步设计-框架搭建,首先我要说的是我们需要开发工具Visual Studio 2012或者10也行,其次是我们要有SQL Server数据库,如果是Visual Studio 2010的话,你还要安装MVC4

  • ASP.NET MVC + Jquery Ajax drop down box data to achieve three levels of linkage 2010-11-17

    This is the first city to use Jquery to achieve three examples of data linkage! I have not used before Jquery, in the WebForm's development, often using the ASP.NET Ajax, ajaxPro + JavaScript, never used a JS framework, a recent study ASP.NET MVC, in

  • ssi框架学习总结(mvc三层架构) 2014-06-17

    相信大家对于mvc的三层架构已经灰常熟悉了,在这就不细讲了,个人感觉ssi的框架结构还是比较典型的mvc三层架构,还是比较容易上手的 相信大家对于mvc的三层架构已经灰常熟悉了,在这就不细讲了,个人感觉ssi的框架结构还是比较典型的mvc三层架构,还是比较容易上手的.关于这块的入门我想特别感谢下FrankHui童鞋,在他的帮助下,我才能比较快滴熟悉了这个架构,对我学习ssi的框架还是很有帮助滴.ssi的框架主要是由struts2,spring以及ibatis组成,他们负责各层之间的交互与协作,从

  • 基于ASP.NET MVC框架开发Web论坛应用程序 2014-09-13

    [IT168 专稿]我想通过本系列文章从头到尾构建一个完整的ASP.NET MVC论坛应用程序,最终的目的是探讨和推动使用ASP.NET MVC框架构建应用程序的最佳实践. 1.简介 在本篇中,我想先从全局方面介绍一下论坛应用程序的总体目标.在本篇中,我将讨论一下避免代码坏味道的重要性,还将讨论如何利用软件设计原则和模式来帮助你编写适合未来改变的富有弹性的代码.最后,我还将论证一下为什么我选择使用测试驱动开发方式构建本系列文章中的论坛应用程序. 2.什么样的软件是好的软件 我不想仅仅为了构建论坛

  • 浅谈MVC.ASP.NETMVC和三层架构的区别 2013-03-16

    MVC 目前流行的软件设计模式,对于WEB应用程序开发是一种非常先进的思想.MVC就是model-view-contrller的简写,是把一个应用的输入处理输出流程按照m-v-c的方式进行编程. V-视 图:代表用户交互界面,视图处理尽现与视图上数据的采集和处理,以及用户请求. M-模 型:业务流程/状态处理以及业务规则的制定,模型接受视图请求并返回最终的处理结果. C-控制器:从用户接受请求,将模型和视图配在一起共同完成用户请求. asp.net mvc是微软基于mvc的开发框架,它具有以下特

  • MVC 框架 ASP.NET MVC 2009-04-03

    ASP.NET MVC 网站 : http://www.asp.net/mvc ASP.NET MVC在现有的ASP.NET 3.5运行时的基础上提供了一个新的MVC框架.开发人员可以用MVC设计模式来构建Web应用,做到清晰的概念分离(UI或者视图与业务应用逻辑分离, 应用逻辑和后端数据分离),同时还可以使用测试驱动开发.ASP.NET MVC框架为Web应用的目录结构定义了一个专用的模式,还提供了一个controller基类,用来处理发动到"action"的请求.开发人员还可以 用

  • 探讨ASP.NET MVC框架内置AJAX支持编程技术 2014-06-06

    传统型ASP.NET Web Forms是基于同时包含了表现层和后台代码的Web页面,所以,紧随其后出现的ASP.NET AJAX,特别是这个框架的服务器端控件并没有像它们本应该的那样光芒四射.于是,很多跟随AJAX时髦的ASP.NET开发者只是向ASP.NET页面中随意地放置一些UpdatePanel控件以便使其程序实现基本的AJAX支持.实际上,这只是防止了页面的"闪烁",而根本上页面还是进行了完整的回发,并且要经历整个页面的生存周期.为了消除ASP.NET Web Forms所依

  • 逃脱Asp.Net MVC框架的枷锁,使用Razor视图引擎 2012-11-26

    更多背景参看 前传:Razor视图引擎浅析 后续: eLiteWeb框架MVC(Model-View-Command) 机制解析 为什么要这么做? 1. Asp.Net MVC 其实也不是太好 2. 我有自己的敏捷Web框架, 仍然想用Razor引擎 3. 动态编译很有意思,这也是将来的一个趋势,如果有人有兴趣,我倒是很想写写这方面的内容. 可是也有这些想法的人并不多,找来找去,这方面的资料和论述极其之少.与其临渊羡鱼,不如退而结网.自己动手,丰衣足食. 如Razor引擎浅析所述,Razor的两

  • ASP.NET MVC 1.0浅析 2014-09-07

    为什么要用ASP.NET MVC 1.0?当我刚知道1.0发布的时候,经常这样问. 1.MVC的组成 Models:访问数据库,装载数据.处理业务逻辑.在项目中体现为数据实体类加业务代理类. Views:显示数据,用户界面.在项目中体现为aspx页面,偶尔可以加上code-behind. Controller:按路由规则将请求的数据传送给指定页面,用于显示:也可以把用户输入的数据传递给逻辑处理类.它可以包含简单的验证逻辑.不应包含数据访问逻辑. 2.为何使用MVC 提出MVC的目的无非是提高开发

  • ASP.NET开发人员需要学习ASP.NET MVC么? 2013-12-06

    最近几周,在博客.Twitter和论坛上如火如荼地展开了一场讨论.讨论的内容是:开发人员是否应该使用或学习ASP.NET MVC.从"不推荐学习"到"所有ASP.NET开发人员都应该学习",各种不同的观点层出不穷.InfoQ对其中部分讨论内容进行了总结. Rob Conerey(SubSonic之父,目前是微软ASP.NET MVC团队的一员)解释了为什么开发人员应该学习ASP.NET MVC.在文章的开始,他称WebForms是一个"巨大的谎言"

  • ASP.NET MVC小结之基础篇(一) 2014-01-11

    本文是ASP.NET MVC系列的第一篇文章,跟其他学习系列一样,咱们先来点基础知识,之后再循序渐进.我们先从asp.net mvc的概念开始吧. 前言:前几天要准备一个演讲,所以准备了MVC的一些基本的东西,以前也使用过MVC,但是只是使用,而不是去了解,所以趁着这个机会好好的把别人的MVC视频看了一下(是一个微软的MVP会员发布的视频,相信有些人都看过),整理除了这个笔记,共享一下子,基本MVC的所有东西都介绍了,但是都是很基础的东西.本来打算一篇发表完的,但是发现东西有点多,所以分成了两篇

  • ASP.NET MVC使用Ajax的辅助的解决方法 2014-11-05

    我们将大致了解一下ASP.NET MVC如何使用Ajax的辅助方法 前言:前面我们已经简单的介绍过了MVC如何Jquery,因为我们如果使用Ajax的话必须要了解Jquery,这篇博客我们将大致了解一下ASP.NET MVC如何使用Ajax的辅助方法,此博客是我的读书笔记,如果那里写的不好,还请各位朋友提出来,我们共同学习. 1.准备工作 (1)在MVC刚开始学习的时候,我们就需要介绍ASP.NET MVC框架中的HTML的辅助方法,但是这类文章现在已经很多了,而且个人感觉很简单,所以没有写笔记

  • Web开发模式的颠覆者:ASP.NET MVC 2014-11-06

    2008年3月微软针对ASP.NET 3.5发布的MVC框架(Preview 2 版本)是一个真正意义上的ASP.NET MVC框架.至今,短短4个月内此框架已经发展到Preview 4版本.许多国内外业界人士称该框架为其前基于Web表单开发模式的历史性"颠覆".本文站在对ASP.NET MVC框架与传统ASP.NET Web表单开发模式进行简明理论对比的角度对ASP.NET MVC框架的发展前景作出初步展望. 一.引言 一直以来,软件架构师们在开发软件的方法及架构方面争论不休.这样的

  • ASP.NET MVC之单元测试分分钟的事 2014-03-13

    一.为什么要进行单元测试? 大部分开发者都有个习惯(包括本人在内),常常不喜欢去做单元测试.因为我们对自己写的程序总是盲目自信,或者存在侥幸心理每次运行通过后就直接扔给测试组的妹子们了.结果妹子一测,大把大把的bug出现了,最后每每看到测试的妹子走过来,心里就只想说一句话:你是猴子请来的逗比吗?本来想节省时间,结果最后花在找BUG和修复BUG的这些时间加起来已经比开发这个模块所花的时间还要多了,最后更要命的是,坑爹的加班就在所难免了!如果一开始将bug遏制在萌芽状态,我们至于这么苦逼吗?SO,单

  • ASP.NET MVC 2 模型验证 2012-05-24

    [原文地址]ASP.NET MVC 2: Model Validation [原文发表日期] Friday, January 15, 2010 4:14 AM [除了写博客外,我现在还使用Twitter发短贴和共享链接.请通过twitter.com/scottgu跟随我.] 这是我针对即将发布的ASP.NET MVC 2所撰写的贴子系列的第二篇,这个博客贴子将讨论 ASP.NET MVC 2中一些验证方面的改进. ASP.NET MVC 2 验证 对用户输入的验证以及强制业务规则/逻辑是大多数w

  • Unobtrusive JavaScript in ASP.NET MVC 3 2013-03-03

    Unobtrusive JavaScript 是什么? <!--以下是常规Javascript下写出来的Ajax--><div id="test"> <a href="http://www.cnblogs.com/" onclick="Sys.Mvc.AsyncHyperlink.handleClick(this, new Sys.UI.DomEvent(event), { insertionMode: Sys.Mvc.Ins

  • ASP.NET MVC 5 - 给数据模型添加校验器 2014-06-11

    在本节中将会给Movie模型添加验证逻辑.并且确保这些验证规则在用户创建或编辑电影时被执行. 拒绝重复DRY ASP.NET MVC 的核心设计信条之一是DRY: "不要重复自己(DRY --Don't Repeat Yourself)".ASP.NET MVC鼓励您指定功能或者行为,只做一次,然后将它应用到应用程序的各个地方.这可以减少您需要编写的代码量,并减少代码出错率,易于代码维护. 给ASP.NET MVC 和 Entity Framework Code First 提供验证支

  • ASP.NET MVC下的四种验证编程方式 2014-07-07

    ASP.NET MVC下的四种验证编程方式 2014-04-09 10:18 蒋金楠 博客园 我要评论(0) 字号:T | T ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定.总地来说,我们可以采用4种不同的编程模式来进行针对绑定参数的验证. AD:WOT2014:用户标签系统与用户数据化运营培训专场 ASP.NET MVC采用Model绑定为

  • 使用Mono.Cecil辅助ASP.NET MVC使用dynamic类型Model 2013-10-07

    这也是之前在珠三角技术沙龙上的示例之一,解决的是在ASP.NET MVC使用dynamic类型Model时遇到的一个真实问题.C# 4编译器支持dynamic类型,因此在编写页面模板的时候自然就可以把它作为视图的Model类型.表现层的需求很容易改变,因此dynamic类型的Model可以减少我们反复修改强类型Model的麻烦,再配合匿名类型的使用,可谓是动静相宜,如鱼得水.不过,如果把一个匿名类型直接作为Model交给视图去使用,在默认情况下会抛出异常.我们可以用Mono.Cecil来改变这一