2012-03-27 3 views
4

.Net4.0 웹 양식 (MVC!가 아닙니다!) 응용 프로그램에서 EF4.3.1을 사용하고 있습니다.IUnitOfWork 사용법 - 우수 사례

나는 저장소 패턴을 IUnitOfWork 인터페이스와 함께 사용하는 경향이 있습니다. 그러나 내가 모범 사례를 따르고 있는지, 특히 내가 따라 왔던 대부분의 사례가 MVC 앱을 기반으로하고 있기 때문에 궁금합니다.

솔루션의 선택에 영향을 줄 수있는 작은 웹 앱 일뿐입니다.

솔루션에는 현재 모델, 논리 및 사이트라는 3 개의 프로젝트가 있습니다. Model은 codefirst 엔티티와 IUnitOfWork 인터페이스를 포함합니다. 로직은 리포지토리와 서비스 계층을 포함합니다. 사이트에는 분명히 웹 사이트, 코드 숨김 등이 포함되어 있습니다.

타사 삽입 유틸리티 (ninject 등)를 사용하지 않습니다. 나는 수동으로 IUnitOfWork 즉

공공 BookingRepository (IUnitOfWork의 UnitOfWork)와 저장소

나는 서비스 층으로 할 것을 명확하지 해요

의 IUnitOfWork 또한 사이트 프로젝트에서 exisit한다, 또는 단지 존재를 주입 논리 및 모델 계층.

현재 나는 서비스 즉

공공 BookingService (IUnitOfWork의 UnitOfWork, IBookingRepository 저장소, IAppSettings appSettings는)

에 저장소와 작업 단위를 주입하지만이 이루어집니다 커밋을 (DB에 저장)을 의미 사이트 수준에서,하지만 그것은 서비스 계층에서 수행되어야하는지 궁금해. 또한 내 IUnitOfWork가 내 모델 계층에서 선언 되었기 때문에 내 사이트에서도 Model에 대한 참조가 필요하다는 것을 의미합니다.

더 잘할 수 있습니까? 내가 뭐라도하고 있니? lol

+0

IUnitOfWork는 리포지토리에 전달되어서는 안됩니다. 예제보기 http://stackoverflow.com/questions/9808577/multiple-generic-repositories-in-unitofwork/9809550#9809550 –

답변

3

드미트리가 옳습니다. 다음은 작업 단위 (UOW)의 샘플 구현입니다. 여기서 유익한 점은 작업 단위 패턴이 모두가 공유하는 단일 데이터베이스 컨텍스트 클래스를 적용하여 여러 저장소의 작업을 조정한다는 점입니다.

이 패턴을 함께 사용하는 방법을 이해하기에 좋은 자료입니다. MVC 및 Web Forms 개발 모두에 유효합니다. Implementing the Repository and Unit of Work Patterns in an ASP.NET MVC Application

public class UnitOfWork : IDisposable 
{ 
    private DbContext _context; 
    private PersonRepository _personRepository; 
    private CompanyRepository _companyRepository; 

    public UnitOfWork(DbContext context) 
    { 
     this._context = context; 
    } 

    public void Commit() 
    { 
     _context.SaveChanges(); 
    } 

    // We lazy-load our repositories... 
    public PersonRepository PersonRepository 
    { 
     get 
     { 
      if (this._personRepository == null) 
      { 
       this._personRepository = new PersonRepository(context); 
      } 
      return _personRepository; 
     } 
    } 

    public CompanyRepository 
    { 
     get 
     { 
      if (this._companyRepository == null) 
      { 
       this._companyRepository = new CompanyRepository(context); 
      } 
      return _companyRepository; 
     } 
    } 

    //IDisposable implementation removed for brevity... 
}