1

좋습니다, 코드 저장소에 대한 종속성 주입 작업 단위를 사용하는 예제가 많습니다. 일반적인 저장소와 모든 좋은 기능을 사용합니다.Entity Framework 4.1 데이터베이스 첫 번째 종속성 삽입 작업 단위

누구나 Database First (dbContext Generator (T4)가있는 edmx), 함수 가져 오기로 저장 프로 시저, 종속성 삽입 작업 단위로이 작업을 수행하는 예제가 있습니까?

답변

2

코드 첫 번째 또는 dbfirst의 컨텍스트는 동일합니다 (DbContext).

저장 프로 시저가 컨텍스트를 호출하는 대신 리포지토리에 매핑됩니다. 사용자는 context.Database.Query ("Proc_whatever")를 호출합니다.

도움이 필요한 특정 지점이 있습니까? 코드 샘플이있을 수 있지만 위의 모든 내용은 di, 코드 첫 번째, 일반 저장소 등과 같은 방식으로 수행됩니다. UnitOfWork 리포지토리가 SaveChanges를 호출하지 않도록하려면 UnitOfWork 인터페이스에 Save()라는 메서드가 있습니다.이 메서드는 차례로 변경 내용을 저장합니다.

코드를 https://github.com/adamtuliper/EF5-for-Real-Web-Applications으로 업데이트하여 작업 단위 (UOW)를 포함하겠습니다. 나는 구현이 마음에 들지 않지만 어떤 것이 옳다고 느끼지 않아 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(); ; 
    } 
} 

발동을 사용하려면 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 어제 사실 어제 블로그를 읽고 있었는데 구현 내용이 내가 본 모든 것 중에서 가장 좋은 것 같아서 질문에 대답 해 주셔서 너무 기쁩니다. 저의 목표는 저장소 사이의 컨텍스트를 공유하고, 서비스 계층에 저장소를 삽입하고, 컨트롤러에 서비스 계층을 주입하고, 단위 테스트를 수행 할 수있게하는 것입니다. DOD는 저장 프로 시저 만 허용하므로 이해하기가 훨씬 더 복잡하고 어렵게 보입니다. – Fab

+0

@Adam Tuliper이 구현에서'UnitOfWork'에 어떻게'ICustomerRepository' 의존성을 삽입 할 수 있습니까? 'CustomerRepository'를 UoW 안에있는 속성으로 설정하지 않아서 우리가 그 의존성을 주입하지 못하게합니까? 감사. –

+0

새 저장소를 시스템에 추가 할 때마다 UnitOfWork 클래스를 변경해야합니다. 나는이 접근 방식에 만족하지 않는다. –

관련 문제