2013-02-08 3 views
1

그래서 해결하려는 문제는 다음과 같습니다. 우리는 Entity Framework를 사용하여 1200-1500 개의 테이블이있는 Oracle 데이터베이스에 액세스합니다. 이제 우리는 그들 모두에 접근하지는 못했지만 아마도 800 명 이상의 사람들이 접근 할 수 있습니다. 우리는 UnitOfWork -> Repository -> Service 패턴을 사용하고 있으며 훌륭하게 작동합니다. 그러나 우리는 하나의 큰 DbContext를 가져야하는지 아니면 당면한 작업에 특정한 여러 개의 작은 컨텍스트를 가져야 하는지를 파악하려고합니다.UnitOfWork 및 Entity Framework 컨텍스트

우리의 UnitOfWork 그래서 같은 EFUnitOfWorkBase를 사용하여 설정입니다 :

public abstract class EFUnitOfWorkBase : IUnitOfWork 
{ 
    private bool isDisposed = false; 

    public DbContextBase Context { get; set; } 

    protected EFUnitOfWorkBase(DbContextBase context) 
    { 
     Context = context; 
    } 

    public int Commit() 
    { 
     return 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(); 
     } 
    } 

    public IRepository<TEntity> GetRepository<TEntity>() where TEntity : Common.EntityBase<TEntity> 
    { 
     return new Repository<TEntity>(this); 
    } 
} 

우리가 만드는 작업의 모든 단위가 기본 일 연장하고 그래서 같은 컨텍스트 제공하십시오 전달

public class EmployeeDirectoryUnitOfWork : EFUnitOfWorkBase 
{ 
    public EmployeeDirectoryUnitOfWork(string connectionString) 
     : base(new EmployeeDirectoryContext(connectionString)) 
    { 
    } 
} 

DbContext를 작업 단위를 통한 연결 문자열.

Repository

은 다음과 같습니다 : 가장이 상황을 처리하는 방법에 대한

public abstract class RepositoryBase<TEntity> : IRepository<TEntity> where TEntity : class 
{ 
    protected DbContextBase Context; 
    protected DbSet<TEntity> EntitySet; 

    public RepositoryBase(EFUnitOfWorkBase unitOfWork) 
    { 
     Enforce.ArgumentNotNull(unitOfWork, "unitOfWork"); 

     Context = unitOfWork.Context; 
     EntitySet = Context.Set<TEntity>(); 
    } 

    public TEntity Add(TEntity entity) 
    { 
     Enforce.ArgumentNotNull(entity, "entity"); 

     return EntitySet.Add(entity); 
    } 

    public TEntity Attach(TEntity entity) 
    { 
     Enforce.ArgumentNotNull(entity, "entity"); 

     return EntitySet.Attach(entity); 
    } 

    public TEntity Delete(TEntity entity) 
    { 
     Enforce.ArgumentNotNull(entity, "entity"); 

     return EntitySet.Remove(entity); 
    } 

    public System.Linq.IQueryable<TEntity> Query() 
    { 
     return EntitySet.AsQueryable(); 
    } 

    public TEntity Save(TEntity entity) 
    { 
     Enforce.ArgumentNotNull(entity, "entity"); 

     Attach(entity); 
     Context.MarkModified(entity); 

     return entity; 
    } 
} 

어떤 제안?

답변

7

이러한 경우에는 이와 같은 대형 응용 프로그램을 사용하는 경우 더 많은 도메인 기반 디자인 접근 방식을 사용하고 컨텍스트를 분리 된 제한된 컨텍스트로 분할해야한다고 생각합니다. 이 방법은 나중에 개발자가 프로그램에 기능을 추가 할 때 사용할 수있는 컨텍스트에 따라 특정 테이블에만 액세스 할 수 있도록 제한됩니다.

더 자세한 정보를 원하면 Julie Lerman은 최근 기업용 Entity Framework에 대한 Pluralsight에 관한 강의를 나왔습니다. 그녀는 this site에 그것의 작은 클립 (실제로는 제한된 컨텍스트)을 게시했습니다. 아주 좋은 코스이고, 특히 당신이하는 것처럼 보이도록 권합니다.

+1

+1 줄리 만 참조. 그녀는 EF의 보스입니다! –

+1

... 나머지 조언은 매우 좋습니다. :) –