2013-02-08 80 views
1

所以我試圖解決的問題是這樣的;我們使用實體框架來訪問我們的擁有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最近推出了一門關於企業中的實體框架的Pluralsight課程,這非常好。她在this site上發佈了一個小剪輯(實際上是關於有界的上下文)。這是一個非常好的課程,我極力推薦它,尤其是對於你正在做的事情。

+1

+1爲朱莉Lerman參考。她是EF老闆! – 2013-02-08 20:40:24

+1

...和其餘的建議是非常健全的:) – 2013-02-08 20:40:55

相關問題