扩展ASP.NET MVC三层框架且使用StructureMap实现依赖注入1-Model层
2013-04-02 00:00
1196 查看
本篇文章将向大家介绍如何添加Service和Repository层并且使用StructureMap把Service层注入到Controller,把Repository注入到Service层。Service层主要是我们的业务逻辑层,这一层不和底层的Database打交道,和Database打交道的是Repository数据持久层。本篇文章通过使用StructureMap依赖注入使Controller,Service,Repository三层的耦合度降到最低。
本系统使用NorthWind开源数据,并且使用EntityFramework5.0实现对数据库的Object映射。
开始正题之前先来看一下成型的框架结构,我们将围绕这个截图进行展开。
首先我们看TYStudioDemo.Models这个Project里面的内容
这里面有我们的EntityFramwork的edmx文件,Northwind的数据库表映射的对象集合。这里建立ADO.Net Entity Data Model的时候没有使用默认生成一堆.tt文件的方式,而是使用了老的形式。实现方法是首先按默认程序建立起data model,建立好data model之后删除.tt文件。然后打开.edmx文件,右键单击空白处选择Properties(属性),会出现下面的截图,这时候只需要修改一下Code Generation Strategy(中文翻译不知道是什么,第一个就对了)的值,默认是None,我们修改为Default,然后保存.edmx
你应该已经注意到了,项目里多了一个TYEntities.cs文件,这个我们是我们这个系统中实现Transaction(事务处理)的关键。
我们使用static和[ThreadStatic]属性来保证一个线程拿到的TYEntities(ObjectContext)总是同一个,这就解决了Transaction事务的问题。没有解释到的请详细阅读下面代码里面的注释。
本系统使用NorthWind开源数据,并且使用EntityFramework5.0实现对数据库的Object映射。
开始正题之前先来看一下成型的框架结构,我们将围绕这个截图进行展开。
首先我们看TYStudioDemo.Models这个Project里面的内容
这里面有我们的EntityFramwork的edmx文件,Northwind的数据库表映射的对象集合。这里建立ADO.Net Entity Data Model的时候没有使用默认生成一堆.tt文件的方式,而是使用了老的形式。实现方法是首先按默认程序建立起data model,建立好data model之后删除.tt文件。然后打开.edmx文件,右键单击空白处选择Properties(属性),会出现下面的截图,这时候只需要修改一下Code Generation Strategy(中文翻译不知道是什么,第一个就对了)的值,默认是None,我们修改为Default,然后保存.edmx
你应该已经注意到了,项目里多了一个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层
- 扩展ASP.NET MVC三层框架并使用StructureMap实现依赖注入2
- 扩展ASP.NET MVC三层框架并使用StructureMap实现依赖注入1-Model层的实现
- 扩展ASP.NET MVC三层框架并使用StructureMap实现依赖注入1
- 扩展ASP.NET MVC三层框架并使用StructureMap实现依赖注入2-Repository层的实现
- 使用StructureMap扩展ASP.NET MVC三层结构框架系列文章总结篇(附源码下载)
- 使用StructureMap扩展ASP.NET MVC三层结构框架系列文章总结篇(附源码下载)
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
- Asp.Net Mvc使用Autofac实现依赖注入
- Asp.net MVC 中使用 Ninject 实现依赖注入
- asp.net mvc Autofac 依赖注入框架 使用
- [ASP.NET MVC 小牛之路]05 - 使用 Ninject实现依赖注入
- 依赖注入框架Autofac的简单使用,以及在 ASP.NET MVC 中的使用
- .NET中使用Unity和StructureMap来实现依赖注入Dependency Injection
- 使用Autofac在ASP.NET Web API上实现依赖注入
- ASP.NET MVC 使用总结(二)——扩展HtmlHelper实现动态生成title及meta
- ASP.NET Core依赖注入解读&使用Autofac替代实现
- ASP.NET MVC Unity实现依赖注入
- ASP.NET MVC 3让依赖注入实现得更简单
- [转载] [翻译]在ASP.NET MVC中使用TDD与依赖注入