1

好的,有很多示例使用Code First的依賴注入工作單元,使用通用存儲庫和所有好東西。實體框架4.1數據庫第一依賴注入工作單元

有沒有人有這樣做與數據庫第一(edmx與dbContext生成器(T4)),存儲過程作爲函數導入,工作單元與依賴注入。

回答

2

代碼優先或dbfirst的上下文將是相同的(DbContext)。

存儲過程映射到您的存儲庫中,而不是調用context.Customers,您可以調用context.Database.Query(「Proc_whatever」)。

有你想幫助的特定點,我可能有這方面的代碼示例,但上述一切都做同樣的方式,爲二,代碼首先,通用倉庫等實現的UnitOfWork唯一的變化爲確保您的存儲庫不調用SaveChanges,您的UnitOfWork接口上有一個名爲Save()的方法,該方法又調用保存更改。

我將更新代碼https://github.com/adamtuliper/EF5-for-Real-Web-Applications以包含一個工作單元。雖然我不喜歡這個實現,但是有些東西感覺不對,並且因此讓我更加相信CQRS。

所以這裏的想法是: 進樣IUnitOfWork IUnitOfWork包含也被注入並映射到上下文的IContext。 IUnitOfWork映射到UnitOfWork具體實現。 的UnitOfWork具體實施引用庫:

這部分是從我的頭頂,所以請原諒任何編譯錯誤,它在原理上顯示


public class YourContext : DbContext, IContext 
{ 
    //just a regular DbContext class except use IDbSet 
    public IDbSet Customers { get; set; } 
} 

public interface IUnitOfWork 
{ 
    ICustomerRepository CustomerRepository { get; } 
    IOrderRepository OrderRepository { get; } 
    void Save(); 
} 
 

public class UnitOfWork : IUnitOfWork, IDisposable 
{ 
     private readonly IContext _context; 
     private ICustomerRepository _customerRepository; 
     private IOrderRepository _orderRepository; 
     private bool _disposed = false; 

     public UnitOfWork(IContext context) 
     { 
      _context = context; 
     } 

     public ICustomerRepository CustomerRepository 
     { 
      get 
      { 
       if (this._customerRepository == null) 
       { 
        this._customerRepository = new CustomerRepository(_context); 
       } 
       return _customerRepository; 
      } 
     } 

     protected virtual void Dispose(bool disposing) 
     { 
      if (!this._disposed) 
      { 
       if (disposing) 
       { 
        ((IDisposable)_context).Dispose(); 
       } 
      } 
      this._disposed = true; 
     } 

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

public class CustomerController : Controller 
{ 
    private readonly IUnitOfWork _unitOfWork; 
    public CustomerController(IUnitOfWork unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    } 

    [AutoMap(typeof(Customer), typeof(CustomerIndexViewModel)] 
    public ActionResult Index() 
    { 
     return _unitOfWork.CustomersRepository.GetAll(); 
     //or if not using AutoMapper, use the viewmodel directly: 
     //return _unitOfWork.CustomersRepository.GetAll().Select(c => new CustomerIndexViewModel 
                { 
                 CustomerId = c.CustomerId, 
                 Address = c.Address, 
                 City = c.City, 
                 State = c.State, 
                 FirstName = c.FirstName, 
                 LastName = c.LastName 
                }).ToArray(); ; 
    } 
} 

要使用PROC在CustomerRepository中,你需要執行以下操作:


public Customer GetById(int id) 
{ 
     return this.Context.Database.SqlQuery("Proc_GetCustomer @customerID", new SqlParameter("@customerID", id)).Single(); 
     //instead of: return this.Context.Customers.Include(o => o.Orders).Single(o => o.CustomerId == id); 
} 

+0

非常感謝你Ada實際上,我昨天正在閱讀你的博客,你的執行似乎是我見過的所有內容中最好的,所以我很高興你回答了這個問題。我的目標是能夠共享資源庫之間的上下文,在服務層注入repositoy,將服務層注入控制器並能夠進行單元測試。國防部只允許存儲過程,因此似乎使它變得更加複雜和難以理解。 – Fab

+0

@Adam Tuliper在這個實現中,你將如何將'ICustomerRepository'依賴注入到'UnitOfWork'中?是不是將'CustomerRepository'設置爲UoW中的一個屬性,阻止我們注入該依賴項?謝謝。 –

+0

每次將新的存儲庫添加到系統中時,都必須更改UnitOfWork類。我對這種方法感到不舒服。 –