2010-09-11 120 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请求生存期进行实例化。