php mvc多层依赖注入,.NET_扩展ASP.NET MVC三层框架且使用StructureMap实现依赖注入1-Model层,本篇文章将向大家介绍如何添 - phpStudy...

左丘修齐
2023-12-01

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

///

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

}

}相关阅读:

win7系统怎么对文件进行双层加密?

苹果Mac电脑如何连接无线网络?Mac无线网络设置方法图解

html5 canvas 画图教程案例分析

C#实现XSL转换的方法

使用Memcache缓存mysql数据库操作的原理和缓存过程浅析

JavaScript实现大数的运算

php中error与exception的区别及应用

MySQL高级查询之与Group By集合使用介绍

ASP.NET中DataTable与DataSet之间的转换示例

table合并单元格与img图片铺满整个td的html

C#中登录窗体和欢迎窗体关闭方法分析

c#对象反序列化与对象序列化示例详解

jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】

使用php实现截取指定长度

 类似资料: