2010-09-11 122 views
1

我有4種不同的模型,我從視圖中的網格中提取信息。此代碼摘錄是我的控制器的索引行動的一部分。每個 模型都有一個存儲庫,partRepository,parts_comboRepository,vendor_partRepository和manufacturer_partRepository,我使用這些存儲庫爲我的連接抓取數據。ASP.Net MVC和存儲庫

var nss_part_combo = 
    from o in parts_comboRepository.FindAll_Parts_Combos() 
     join parts in partRepository.FindAll_Parts() 
     on o.FK_Parts_ID_PARTS equals parts.ID_PARTS into joined_parts 
    from parts in joined_parts.DefaultIfEmpty() 
     join vendor_parts in vendor_partRepository.FindAllVendor_Parts() 
     on o.FK_Vendor_Parts_ID_VENDOR_PARTS equals vendor_parts.ID_VENDOR_PARTS into joined_vendor_parts 
    from vendor_parts in joined_vendor_parts.DefaultIfEmpty() 
     join manufacturer_parts in manufacturer_partRepository.FindAllManufacturer_Parts() 
     on o.FK_Manufacturer_Parts_ID_MANUFACTURER_PARTS equals manufacturer_parts.ID_MANUFACTURER_PARTS into joined_manufacturer_parts 
    from manufacturer_parts in joined_manufacturer_parts.DefaultIfEmpty() 
    select new NSS.ViewModel.Part_ComboViewModel 
    { 
     ... 
    }; 

return View(new GridModel(part_combo)); 

當我運行它時,出現有關具有不同上下文的錯誤。我通過在控制器的頂部聲明一個實體並使用它來代替我的資源庫對象來獲取所有IEnumerables的連接,從而解決了問題。這是一個好方法嗎?我覺得我已經偏離了我應該做的事情,並創建了一個黑客來解決我的問題。解決這個問題最好的做法是什麼?

+2

請參閱http://stackoverflow.com/search?q=objectcontext+lifetime瞭解如何管理ObjectContext生命週期的討論。 – 2010-09-11 05:06:35

+0

謝謝,這是有用的,不知道什麼關鍵字來尋找描述我的問題,但這有幫助。 – mattnss 2010-09-21 00:09:39

回答

0

我使用這種方法:

// I'm using top level class - UnitOfWork which is Abstract factory for my Data access layer 
// Unit of work is the only class which can get me instances of repositories 
// It is also the holder for ObjectContext 
public class UnitOfWork : IUnitOfWork, IDisposable 
{ 
    private ObjectContext _context; 

    public UnitOfWork(string connectionString) 
    { 
     if (String.IsNullOrEmpty(connectionString)) 
     { 
      throw new ArgumentNullException("connectionString"); 
     } 

     _context = new ObjectContext(connectionString); 
    } 

    private IRepository<Post> _postRepository; 

    public IRepository<Post> PostRepository 
    { 
     get 
     { 
      if (_postRepository == null) 
      { 
       // Repositories are defined in the same assembly as UnitOfWork and have internal contructor. 
       _postRepository = new PostRepository(_context); 
      } 

      return _postRepository; 
     } 
    } 

    // Other repositories 

    // Dispose() 

    // Unit of work saves changes made to entities from all repositories. 
    public void Flush() 
    { 
     _context.SaveChanges(); 
    } 
} 

基於應用程序的UnitOfWork的複雜性是由業務層依賴注入或直接由控制器依賴注入消耗。您必須創建自定義ControllerFactory並使用IoC來注入它。 UnitOfWork在IoC中定義爲按照HTTP請求生存期進行實例化。