2012-08-28 2 views
5

EF/저장소/작업 단위를 사용하고 있지만 일부 세부 사항을 이해하는 데 어려움을 겪고 있습니다. UnitOfWork 내부에서 새 EF DbContext (EmmaContext)를 만들었지 만 저장소 내부를 보았습니다. 내가 잘못 알고있는 캐스팅했는데 어떻게하면 레노 내부의 컨텍스트를 올바르게 얻을 수 있습니까? 어쩌면 나는 완전히 잘못된 길을 가고 있습니까? 이 에서엔티티 프레임 워크 및 작업 단위

//Interface 
public interface IRepository<TEntity> where TEntity : class 
{ 
    IQueryable<TEntity> Query(); 
    void Add(TEntity entity); 
    void Attach(TEntity entity); 
    void Delete(TEntity entity); 
    void Save(TEntity entity); 
} 

//Implementation 
public abstract class RepositoryBase<TEntity> : IRepository<TEntity> where TEntity : class 
{ 
    #region Fields/Properties 
    protected EmmaContext context; 
    protected DbSet<TEntity> dbSet; 
    #endregion 

    #region Constructor(s) 
    public RepositoryBase(IUnitOfWork unitOfWork) 
    { 
     this.context = ((UnitOfWork)unitOfWork).Context; 
     this.dbSet = context.Set<TEntity>(); 
    } 
    #endregion 

    #region Methods 
    public void Add(TEntity entity) 
    { 
     dbSet.Add(entity); 
    } 

    public void Attach(TEntity entity) 
    { 
     dbSet.Attach(entity); 
    } 

    public void Delete(TEntity entity) 
    { 
     dbSet.Remove(entity); 
    } 

    public IQueryable<TEntity> Query() 
    { 
     return dbSet.AsQueryable(); 
    } 

    public void Save(TEntity entity) 
    { 
     Attach(entity); 
     context.MarkModified(entity); 
    } 
    #endregion 
} 

답변

4

샘 :

public RepositoryBase(UnitOfWork unitOfWork) 
    { 
     this.context = unitOfWork.Context; 
     this.dbSet = context.Set<TEntity>(); 
    } 

저장소 및 UOW는 일반적으로 콘서트에서 작동 서로에 대해 조금 알 필요가 : 나는 보통 콘크리트 저장소가 ctor에있는 콘크리트의 UnitOfWork를 복용 편안한 느낌.

물론 이러한 클래스를 사용하는 코드는 구체적인 유형이 아니라 인터페이스 정의에 대해서만 알고 있습니다.

+0

이것은 기본적으로 내가 한 일로 IUnitOfWork 인터페이스를 추가했지만 유닛 테스트에서는 무엇을 생각하니? 리포지토리와 작업 단위를 단위 테스트 할 것입니까? – Sam

+0

조금 생각한 후 구현 코드를 호출 코드로 추상화하고 IoC 컨테이너의 레포로 컨텍스트를 가져 오는 방법을 궁금합니다. 코드 샘플이 있습니까? 감사! BTW - 방금 MVC 3.0 서적, 훌륭한 책을 읽었습니다! – Sam

+0

@Sam - thanks :) – OdeToCode

1

당신이 당신의 저장소베이스 IUnitOfWork 인터페이스를 구현할 필요가 있다고 말한다 : 여기

//Interface 
public interface IUnitOfWork : IDisposable 
{ 
    void Commit(); 
} 

//Implementation 
public class UnitOfWork : IUnitOfWork 
{ 
    #region Fields/Properties 
    private bool isDisposed = false; 
    public EmmaContext Context { get; set; } 
    #endregion 

    #region Constructor(s) 
    public UnitOfWork() 
    { 
     this.Context = new EmmaContext(); 
    } 
    #endregion 

    #region Methods 
    public void Commit() 
    { 
     this.Context.SaveChanges(); 
    } 

    public void Dispose() 
    { 
     if (!isDisposed) 
      Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    private void Dispose(bool disposing) 
    { 
     isDisposed = true; 
     if (disposing) 
     { 
      if (this.Context != null) 
       this.Context.Dispose(); 
     } 
    } 
    #endregion 
} 

저장소입니다 :

여기 내 UnitOfWork에 있습니다.

나는이 도움이되기를 바랍니다. 감사

4

이것은 best article I've read입니다. 자신의 예에서

, 그들은이 같은 저장소를 관리 :

private SchoolContext context = new SchoolContext(); 
    private GenericRepository<Department> departmentRepository; 
    private GenericRepository<Course> courseRepository; 

    public GenericRepository<Department> DepartmentRepository 
    { 
     get 
     { 

      if (this.departmentRepository == null) 
      { 
       this.departmentRepository = new GenericRepository<Department>(context); 
      } 
      return departmentRepository; 
     } 
    } 
, 작업 귀하의 장치가 컨텍스트를 보유하고 저장소를 참조해야하는 경우가 생성되지 않은 경우, 그것을 만들어

및 보유하고있는 맥락에서 전달됩니다.

이 기사에서는 일반 MVC 컨트롤러 구현을 작업 단위 패턴으로 변환하는 방법도 설명합니다.

+0

멋진 기사! 링크를 가져 주셔서 감사합니다. –

+7

나쁜 기사! 그들은 도구와 함께 주입하는 대신 단위 작업 클래스 내에 컨텍스트와 저장소를 생성합니다. – Elisabeth

0

Unit of Work
Repository

의 UnitOfWork 원자 동작을 관리하기위한 것이다.

저장소는 데이터 저장소에 보존 된 개체 집합과 개체를 통해 수행되는 작업을 캡슐화합니다.

UnitOfWork + 저장소 패턴을 구현하지 않은 것보다 컨텍스트 또는 UnitOfWork를 전달하면 UnitOfWork의 책임을 철회하게됩니다. 일명 당신은 그것을 필요로하지 않습니다.

DbSet 만 전달하면 올바르게 구현됩니다. 실제로 당신은 더 많은 것을 필요로하지 않습니다.

관련 문제