源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2022-06-07 22:45 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:扩展ASP.NET MVC三层框架且使用StructureMap实现依赖注入1-Model层
本篇文章将向大家介绍如何添加Service和Repository层并且使用StructureMap把Service层注入到Controller,把Repository注入到Service层。Service层主要是我们的业务逻辑层,这一层不和底层的Database打交道,和Database打交道的是Repository数据持久层。本篇文章通过使用StructureMap依赖注入使Controller,Service,Repository三层的耦合度降到最低。 本系统使用NorthWind开源数据,并且使用EntityFramework5.0实现对数据库的Object映射。 [b]开始正题之前先来看一下成型的框架结构,我们将围绕这个截图进行展开。[/b] [img]http://files.jb51.net/file_images/article/201304/201304020948265.png[/img]   [b]首先我们看TYStudioDemo.Models这个Project里面的内容[/b] [img]http://files.jb51.net/file_images/article/201304/201304020948266.png[/img] 这里面有我们的EntityFramwork的edmx文件,Northwind的数据库表映射的对象集合。这里建立ADO.Net Entity Data Model的时候没有使用默认生成一堆.tt文件的方式,而是使用了老的形式。实现方法是首先按默认程序建立起data model,建立好data model之后删除.tt文件。然后打开.edmx文件,右键单击空白处选择Properties(属性),会出现下面的截图,这时候只需要修改一下Code Generation Strategy(中文翻译不知道是什么,第一个就对了)的值,默认是None,我们修改为Default,然后保存.edmx [img]http://files.jb51.net/file_images/article/201304/201304020948267.gif[/img] 你应该已经注意到了,项目里多了一个TYEntities.cs文件,这个我们是我们这个系统中实现Transaction(事务处理)的关键。 我们使用static和[ThreadStatic]属性来保证一个线程拿到的TYEntities(ObjectContext)总是同一个,这就解决了Transaction事务的问题。没有解释到的请详细阅读下面代码里面的注释。
[u]复制代码[/u] 代码如下:
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      }  }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部