2012-08-31 1 views
0

EF 코드 우선, 저장소, 작업 단위 등에 대한 블로그/문서/기타의 믿을 수 없을 정도의 양을 넘어 섰습니다.이 접근법에 대한 생각 : EF5 코드 우선, 저장소 패턴, UofW 등

내가 편리한 핸들을 내 다음 프로젝트에 대한 프레임 워크를 만들려고 해요 :

  • 나에게 정의 할 수있는 옵션을 제공합니다 (Windows 서비스를 전 용)

    1. 모두 웹 환경 (HttpContext를) 및 독립형 특정 엔터티에 대한 저장소 또는 간단한 쿼리에 대한 일반 저장소를 사용합니다.

    EF를 내 리포지토리에 캡슐화하지 않기로 결정했습니다. 우리가 다른 ORM으로 전환하는 것을 언제 생각할지는 모르겠습니다.

    그래서 나는 다음을 생각해 내 의견을 듣게되어 기쁩니다! :) 나는 (내가 언급 링크에서처럼)은 DbContext 전달에 대해 걱정할 필요가 없습니다 위의 일반적인 REPO에서

    namespace Data.Repositories 
    { 
    internal class DbContextInstance 
    { 
        public static readonly DbContext Context; 
    
        static DbContextInstance() 
        { 
         if (System.Web.HttpContext.Current != null) 
         { 
          if (System.Web.HttpContext.Current.Items["__DBCONTEXT"] == null) 
           System.Web.HttpContext.Current.Items["__DBCONTEXT"] = new MyDbContext(); 
    
          Context = System.Web.HttpContext.Current.Items["__DBCONTEXT"] as MyDbContext; 
         } 
         else 
         { 
          if (Context == null) 
           Context = new MyDbContext(); 
         } 
        } 
    } 
    
    public class GenericRepository<TEntity> : IDisposable where TEntity : class 
    { 
        //Implementation of repo. Similar to GenericRepository here: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application 
        //whenever I need to access the context I'm using DbContextInstance.Context 
    } 
    

    , 그것에 대해 DbContextInstance 걱정 때문이다. 연결 문자열을 구성 할 수있는 단일 지점입니다. 그 부분을 간단하게 유지했지만 연결 문자열 이름을 어딘가에서 읽을 수 있도록 향상시킬 수 있습니다.

    일반 Repo는 IDisposable입니다. Dispose 메서드에서 Context를 처리합니다. 위의 코드는 세션 (HTTP 요청 또는 EXE 응용 프로그램의 수명)에 하나 이상의 컨텍스트가 없는지 확인합니다. 물론 처분되지 않는 한.

    작업 단위 클래스는 단순히 저장소를 인스턴스화하고 상호 작용합니다. 그들은 또한 IDisposable이고 repos를 처분 할 것이다.

    DB에 대한 테스트 및 모형을 작성합니다. DB를 초기화하고 초기 데이터를 미리 채울 수있는 스크립트가 있습니다. 나는 물건을 에뮬레이트하는 실제 모형이 아닌 모형을 시험해 보는 것이 가장 좋습니다.

    이 코드는 다양한 장소에서 비트와 조각입니다 + 내 자신의 창의성의 일부 ..

    앱가 실행 이미 때 나중에 고통의 원인이 무엇이든을 볼 수

    ? 내 얼굴에 그것을 던져! ;)

    고마워요! :)

  • +0

    요청 끝에 문맥을 어떻게 처리합니까? 내게는 컨텍스트 수명이 잠재적으로 여러 요청에 걸쳐있는 것처럼 보입니다. – Slauma

    +0

    @Slauma : 코드를 검토해 주셔서 감사합니다! UofW 인스턴스에 using() 블록을 사용할 것이라고 생각했습니다. Btw, 요청 당 HttpContext.Items 컬렉션에 저장되어 있으므로 컨텍스트가 여러 요청에 걸쳐있을 수 있는지 확신 할 수 없습니다. – justabuzz

    +0

    예,하지만 정적 변수에 컨텍스트를 보유하고 있기 때문에 새 컨텍스트를 만들고 정적 변수를 덮어 쓰는 다음 요청이있을 때까지 컨텍스트가 유지됩니다. 그 이후에 새로운 컨텍스트를 사용하면 이전 컨텍스트는 아직 가비지 수집되지 않을 수 있으므로 두 개의 다른 컨텍스트에 연결되는 엔티티가있을 수 있습니다. – Slauma

    답변

    3

    컨텍스트는 수명이 짧아야합니다. 코드는 컨텍스트의 수명이 길고 공유됨을 의미합니다. 이것은 슬픔을 일으킬 것입니다.

    +0

    코멘트 주셔서 감사합니다! 웹 환경에 관해서는 전체 요청에 대해 동일한 컨텍스트를 유지할 것이라고 생각했습니다. 그것은 긴 수명으로 간주됩니까? 나는 당신이 비 HTTP 환경을 다시 말하는 것을 본다. – justabuzz