• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    扩展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映射。

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

     

    首先我们看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 core 依赖注入
    • ASP.NET Core 过滤器中使用依赖注入知识点总结
    • ASP.NET MVC实现依赖注入的完整过程
    • ASP.NET Core依赖注入系列教程之控制反转(IoC)
    • ASP.NET Core依赖注入系列教程之服务的注册与提供
    • 详解ASP.NET Core 中的框架级依赖注入
    • 详解ASP.NET Core 在 JSON 文件中配置依赖注入
    • 解读ASP.NET 5 & MVC6系列教程(7):依赖注入
    • 在ASP.Net Web Forms中使用依赖注入的步骤
    上一篇:.NET动态加载用户控件并传值的方法
    下一篇:aspnetpager重写url(伪静态)配置实例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

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