2016-07-14 5 views
0

여기엔티티 프레임 워크와 함께 적절한 일반 저장소 구조 C# MVC를 사용 할 수 없습니다

public interface IRepository<TEntity> 
    { 
     void Insert(TEntity entity); 
     void Delete(TEntity entity); 
    } 

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class 
    { 
     DbSet<TEntity> DbSet; 
     TestDBEntities dataContext; 

     public Repository(TestDBEntities dataContext) 
     { 
      this.dataContext = dataContext; 
      this.DbSet = dataContext.Set<TEntity>(); 
     } 

     public void Insert(TEntity entity) 
     { 
      DbSet.Add(entity); 
      dataContext.SaveChanges(); 
     } 

     public void Delete(TEntity entity) 
     { 
      DbSet.Remove(entity); 
     } 

     public IQueryable<TEntity> SearchFor(Expression<Func<TEntity, bool>> predicate) 
     { 
      return DbSet.Where(predicate); 
     } 

    } 

으로 C# MVC에서 저장소 패턴을 구현하는 IRepository와라는 클래스 저장소의 이름과 인터페이스 내 컨트롤러있다 :

public class HomeController : Controller 
{ 

    private IRepository<Tbl_EmpDetails> _EmpDetails; 

    public HomeController() 
    { 
     _EmpDetails = new Repository<Tbl_EmpDetails>(new TestDBEntities()); 
    } 

    public ActionResult Index() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Index(Tbl_EmpDetails empDetials) 
    { 
     _EmpDetails.Insert(empDetials); 
     return Redirect("/"); 
    } 

} 

컨트롤러에서 내 생각에 따라 EDMX 인스턴스가 삽입, 업데이트, 삭제 또는 컨트롤러의 다른 함수를 호출 할 때 반복 작성되므로 "new TestDBEntities()"를 사용할 필요가 없습니다. 저장소의 사용. (TestDBEntity 내 EDMX의 개체입니다).

_EmpDetails = new Repository<Tbl_EmpDetails>(new TestDBEntities()); 

Tbl_EmpDetails는 EDMX에서의 테이블입니다.

내 코드에 따라 저장소 구조를 구현하는 가장 좋은 방법은 무엇이며 내 코드를 개선하기위한 다른 제안이있는 경우 제안하십시오.

미리 감사드립니다.

+0

http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc에서 살펴 보는 것이 매우 도움이된다. -4-asp-net-mvc 응용 프로그램에서 저장소 및 작업 단위 패턴 구현. 그것은 단계별로 직접 컨텍스트 대신 리포지토리의 사용을 변경하는 것을 설명합니다. –

답변

0

이것은 내 프로젝트의 구조입니다.

Project.Web 
    -> Controllers 

Project.Domain 
    -> Contracts 
    -> Services 

Project.Data 
    -> Contracts 
    -> Repositories 

그래서 내 컨트롤러 만 서비스가 노출 된 (그래서 모든 구현은 캡슐화). 이 종속성을 처리하기 위해 ninject을 사용했습니다. MY 도메인 PROJECT

인터페이스 및이 인터페이스가 구현 된 파생 된 클래스 INSIDE

public SomeController(IService service) 
{ 
} 

. 기본적으로 이것은 단지 저장소 프로젝트를 호출하고 다른 비즈니스 로직은 여기에 있어야합니다.

인터페이스

public interface IService 
    { 
     IEnumerable<SomeClass> FindAll(); 
    } 

I는 두 가지 구현 인터페이스 하나와 또 다른 하나가

내 데이터 PROJECT

INSIDE

public class Service : IService 
    { 
     private ISomeRepository _someRepository; // Exposed instance of my repo 

     public IEnumerable<SomeClass> FindAll() 
     { 
      return _someRepository.FindAll(); 
     } 
    } 

구현 구현하는 클래스 이 인터페이스를 고수합니다.

인터페이스

public interface ISomeRepository 
    {   
     IEnumerable<Some> FindAll(); 
    } 

당신이 BaseRepositoryUnitOfWork의 사용이 무엇인지 궁금해하는 경우 구현

public class SomeRepository : BaseRepository, ISomeRepository 
    { 
     public R(IUnitOfWork unitOfWork) 
      : base(unitOfWork) 
     { 

     } 

     public IEnumerable<SomeClass> FindAll() 
     { 
      return this.GetDbSet<SomeClass>(); 
     } 
    } 

,이 뜻은 우리의 모델 (EDMX)의 컨텍스트를 보유하고 있습니다.일

public class UnitOfWork : IUnitOfWork, IDisposable 
    { 
     public DbContext Database { get; private set; } 

     public UnitOfWork(DbContext dbContext) 
     { 
      Database = dbContext; 
     } 

     public void SaveChanges() 
     { 
      Database.SaveChanges(); 
     } 

     public void Dispose() 
     { 
      Database.Dispose(); 
     } 
    } 

자료 저장소

public class BaseRepository 
     { 
      protected IUnitOfWork UnitOfWork { get; set; } 

      protected MyEntities Context 
      { 
       get { return (MyEntities)this.UnitOfWork.Database; } 
      } 

      public BaseRepository(IUnitOfWork unitOfWork) 
      { 
       if (unitOfWork == null) throw new ArgumentNullException("unitOfWork"); 
       this.UnitOfWork = unitOfWork; 
      } 

      protected virtual DbSet<TEntity> GetDbSet<TEntity>() where TEntity : class 
      { 
       return this.Context.Set<TEntity>(); 
      } 

      protected virtual void SetEntityState(object entity, EntityState entityState) 
      { 
       this.Context.Entry(entity).State = entityState; 
      } 
     } 

유닛 IUnitOfWork 인터페이스 이것에 대한 그래서

public interface IUnitOfWork 
    { 
     DbContext Database { get; } 

     /// <summary> 
     /// Saves changes to all objects that have changed within the unit of work. 
     /// </summary> 
     void SaveChanges(); 
    } 

, 우리는 관심의 분리의 문제를 수용 그리고 각 프로젝트는 그것의 진정한 목적을 위해 봉사한다.

+0

고마워 Desperado,하지만 난 그저 내 구현이 괜찮습니까 또는 내가 내 코드를 개선해야 할 필요가 있는지 확인하고 싶다 ... 당신에 따르면, 바로 구현을하고 있습니까 ?? 특히 컨트롤러의 생성자에서 "new TestDBEntities()"를 추가합니다. –

+0

@AmandeepSingh 그게 옳지 않다, 나중에 비즈니스 로직이 있기 때문에 컨트롤러가 혼잡 해져서 우리가 좋아하지 않아서 컨트롤러가 직접 컨텍스트를 수정하면 안된다. – Sherlock

+0

OK @ Desperado, 다시 한번 감사드립니다. 제 코드를 가능한 한 간단하게 최상의 구조로 수정 해 주시겠습니까? 내가이 개념을 처음 접했을 때. –