北大青鸟光谷校区

北大青鸟光谷校区

  • 北大青鸟徐东校区
  • 北大青鸟光谷校区
  • 北大青鸟宏鹏IT校区
  • 荆州青鸟之家
  • 襄阳青鸟之家

15902769092

百日千才

北大青鸟武汉宏鹏.net技术 ASP.NET MVC三层框架

2013-04-07 13:56来源:武汉北大青鸟光谷校区作者:武汉宏鹏

  北大青鸟武汉宏鹏光谷校区.net技术:ASP.NET MVC三层框架

        今天开始天屹将给大家分享一个扩展的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映射。

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

北大青鸟武汉宏鹏.net技术

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

北大青鸟武汉宏鹏.net技术

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

北大青鸟武汉宏鹏.net技术

  你应该已经注意到了,项目里多了一个TYEntities.cs文件,这个我们是我们这个系统中实现Transaction(事务处理)的关键。

  我们使用static和[ThreadStatic]属性来保证一个线程拿到的TYEntities(ObjectContext)总是同一个,这就解决了Transaction事务的问题。没有解释到的请详细阅读下面代码里面的注释。

  View Codes

  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; }

  ///

  /// 当系统工作在HttpContext下,将使用延迟家在技术返回一个TYEntities(ObjectContext),如果没有HttpContext将返回null

  ///

  /// 不论在哪里使用TYEntities,在请求结束后都需要调用TYEntities.Cleanup()方法

  /// 佳的方式是TYEntities.Cleanup()放到Global.asax.cs文件里面。

  /// void Application_EndRequest(object sender, EventArgs e)

  /// {

  /// TYStudioDemo.Models.TYEntities.Cleanup();

  /// }

  ///

  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;

  }

  }

  ///

  /// 这是一个用来获取TYEntities(ObjectContext)的公共属性

  ///

  /// 如果你通过HttpContext获取TYEntities,同样不论在哪里使用TYEntities,在请求结束后都需要调用TYEntities.Cleanup()方法

  ///

  /// 如果没有通过HttpContext获取TYEntities,你必须在使用结束之后调用TYEntities.Cleanup()方法,来清理ObjectContext。

  ///

  /// 需要注意的一点是,无论使用哪种方式获取TYEntities,我们都必须手动的清理和Dispose TYEntities(ObjectContext)。

  /// 所以一定不要在using块中使用TYEntities(ObjectContext)。

  ///

  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;

  }

  }

  ///

  /// 清理结束TYEntities(ObjectContext)

  ///

  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

  }

  }

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

         北大青鸟武汉宏鹏光谷校区.net专业课程报名热线:15902769092

关闭

只为了方便您就学 北大青鸟光谷校区 北大青鸟光谷校区

武汉市江夏区华泰街武昌理工学院对面

全真项目实战 入学签就业协议

Copyright (c) 2006-2021 武汉宏鹏教育咨询有限公司 版权所有 All Rights Reserved.