热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

本篇文章将向大家介绍如何添加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映射。

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

mvc-customized-framework

 

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

mvc-customized-framework

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

edmx-propertoties

你应该已经注意到了,项目里多了一个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; }

         ///
         /// 当系统工作在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
     }
 }


推荐阅读
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • 本文详细介绍了Mybatis中#与$的区别及其作用。#{}可以防止sql注入,拼装sql时会自动添加单引号,适用于单个简单类型的形参。${}则将拿到的值直接拼装进sql,可能会产生sql注入问题,需要手动添加单引号,适用于动态传入表名或字段名。#{}可以实现preparedStatement向占位符中设置值,自动进行类型转换,有效防止sql注入,提高系统安全性。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 双极型晶体管的制造工艺及应用
    本文介绍了双极型晶体管作为最早发明的半导体器件,在集成电路生产中的重要地位。双极型工艺凭借其高速、高跨导、低噪声以及较高的电流驱动能力等优势,得到了快速发展。文章详细介绍了双极型晶体管的基本元素、隔离工艺以及制作工艺流程。隔离技术包括pn结隔离、全介质隔离以及pn结-介质混合隔离等。制造工艺流程包括衬底选择、光刻、扩散、氧化等步骤。本文可作为双极型晶体管制造工艺及应用的参考资料。 ... [详细]
  • Kali Linux 简介
    KaliLinux是世界渗透测试行业公认的优秀的网络安全审计工具集合,它可以通过对设备的探测来审计其安全性,而且功能完备,几乎包含了目前所 ... [详细]
  • 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之六 || API项目整体搭建 6.1 仓储模式
    代码已上传Github+Gitee,文末有地址  书接上文:前几回文章中,我们花了三天的时间简单了解了下接口文档Swagger框架,已经完全解放了我们的以前的Word说明文档,并且可以在线进行调 ... [详细]
  • C#设计模式之八装饰模式(Decorator Pattern)【结构型】
    一、引言今天我们要讲【结构型】设计模式的第三个模式,该模式是【装饰模式】,英文名称:DecoratorPattern。我第一次看到这个名称想到的是另外一个词语“装修”,我就说说我对“装修”的理 ... [详细]
  • 电脑吃鸡按键详细_北通J1手游按键评测:一秒15发的“吃鸡”神器
    近年来,随着战术竞技手游的崛起,在大地图中搜集物资、模拟特种兵对抗等玩法深受玩家喜爱。然而受限于“吃鸡”对移动、视角与射击协同操作的较高要求࿰ ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • PreparedStatement防止SQL注入
    添加数据:packagecom.hyc.study03;importcom.hyc.study02.utils.JDBCUtils;importjava.sql ... [详细]
  • 一、Struts2是一个基于MVC设计模式的Web应用框架在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2优点1、实现 ... [详细]
author-avatar
我是黄小果1960
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有