ASP.NET MVC 3 층 프레임 워 크 를 확장 하고 StructureMap 을 사용 하여 의존 주입 1-Model 층 실현

이 글 은 Service 와 Repository 층 을 추가 하고 StructureMap 을 사용 하여 Service 층 을 Controller 에 주입 하여 Repository 를 Service 층 에 주입 하 는 방법 을 소개 합 니 다.Service 층 은 주로 우리 의 업무 논리 층 으로 밑바닥 의 Database 와 접촉 하지 않 고 Database 와 접촉 하 는 것 은 Repository 데이터 지구 층 입 니 다.이 글 은 StructureMap 의존 주입 을 통 해 Controller,Service,Repository 3 층 의 결합 도 를 최소 화 합 니 다.이 시스템 은 NorthWind 오픈 소스 데 이 터 를 사용 하고 EntityFramework 5.0 을 사용 하여 데이터베이스 에 대한 Object 맵 을 실현 합 니 다.주 제 를 시작 하기 전에 성형 한 프레임 구 조 를 살 펴 보고 이 캡 처 를 중심 으로 전개 하 겠 습 니 다.
mvc-customized-framework
 우선 TYStudio Demo.Models 라 는 프로젝트 의 내용 을 살 펴 보 겠 습 니 다.
mvc-customized-framework
이 안 에는 우리 의 Entity Framwork 의 edmx 파일,Northwind 데이터베이스 시트 맵 의 대상 집합 이 있 습 니 다.ADO.Net Entity Data Model 을 만 들 때 기본 값 으로.tt 파일 을 만 드 는 방식 이 아니 라 오래된 형식 을 사용 합 니 다.실현 방법 은 우선 기본 프로그램 에 따라 data model 을 만 들 고 data model 을 만 든 후에.tt 파일 을 삭제 하 는 것 입 니 다.그 다음 에.edmx 파일 을 열 고 오른쪽 단 추 를 눌 러 서 Properties(속성)를 선택 하면 다음 캡 처 가 나타 납 니 다.이때 Code Generation Strategy(중국어 번역 은 뭔 지 모 르 지만 첫 번 째 는 맞습니다)의 값 만 수정 하면 됩 니 다.기본 값 은 None 입 니 다.우 리 는 Default 로 수정 한 다음 에 저장 합 니 다.edmx
4.567916.프로젝트 에 TYEntities.cs 파일 이 하나 더 있다 는 것 을 알 게 되 었 을 것 입 니 다.이것 은 우리 시스템 에서 Transaction(사무 처리)을 실현 하 는 관건 입 니 다.저 희 는 static 과[ThreadStatic]속성 을 사용 하여 하나의 스 레 드 가 가 져 온 TYEntities(Object Context)가 항상 같 음 을 보증 합 니 다.이것 은 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
     }
 }

좋은 웹페이지 즐겨찾기