어떤 방법이 더 좋습니까? DbContext에 대한 자체 래퍼를 만들거나 Controller에서 DbContext를 사용하십시오.

asp.net-core asp.net-core-mvc c# entity-framework-core

문제

내 프로젝트에서는 엔티티 프레임 워크 7asp.net mvc 6 \ asp.net 5를 사용 합니다. 자신의 모델에 CRUD를 만들고 싶습니다.

어떻게하면 더 잘할 수 있을까요?

  1. 컨트롤러에서 dbcontext를 사용하십시오. 다음 링크 작성자는이 방법이 더 좋다고 설명하지만 컨트롤러에 적합한 지 여부를 설명합니다.
  2. 자신의 포장지를 만드십시오. 일부 모범 사례 에서는 자체 저장소를 수행하는 것이 가장 좋은 방법 에 대해 씁니다.

특정 구현에서 데이터에 액세스하는 강력한 연결성이 있더라도 ef를 변경하지 않을 것이므로 ef7 dbcontext에서 즉시 작업 단위 및 저장소 패턴 단위를 구현한다는 것을 알고 있습니다.

수락 된 답변

귀하의 질문에 대한 대답은 주로 의견을 기반으로합니다. 아무도 다른 질문에 답을 얻을 때까지는 "한 가지 방법이 다른 것보다 낫다"라고 말할 수는 없습니다. 프로젝트의 규모 / 범위 / 예산은 얼마입니까? 얼마나 많은 개발자가 작업하고 있습니까? MVC 컨트롤러 만 (보기 기반) 또는 API 컨트롤러를 (데이터 기반) 가질 수 있습니까? 후자의 경우 MVC와 API 작업 방법이 중복되는 정도는 무엇입니까? WPF와 같은 비 웹 클라이언트도 있습니까? 신청서를 어떻게 테스트 할 계획입니까?

Entity Framework는 DAL (데이터 액세스 계층) 도구입니다. 컨트롤러는 HTTP 클라이언트 요청 및 응답 처리 도구입니다. 귀하의 응용 프로그램이 순수한 CRUD (의심스럽지 않은)가 아니면, HTTP를 통한 웹 요청을받을 때와 EF를 사용하여 요청 데이터를 데이터베이스에 저장할 때해야 할 일종의 비즈니스 로직 처리가있을 것입니다 필드 X가 필요합니다. 필드 Y에 대한 데이터를 제공하는 경우 필드 Z에 대한 데이터도 제공해야합니다. 따라서 EF 코드를 컨트롤러에서 직접 사용한다면 비즈니스 프로세싱 로직이 컨트롤러와 함께 컨트롤러에 거의 확실하게 제공된다는 것을 의미합니다.

.NET으로 평범하지 않은 응용 프로그램을 개발하는 데 상당한 경험이있는 사람들은 이러한 디자인이 구현 될 때 나타나는 어려움 때문에 비즈니스 또는 데이터 액세스 논리가 컨트롤러에 나타나지 않아야한다는 의견을 제시하는 경향이 있습니다. 예를 들어 웹 / HTTP 요청 및 응답 로직을 비즈니스 로직 및 데이터 액세스 로직과 함께 컨트롤러에 넣으면 결국 컨트롤러 동작 자체에서 모든 애플리케이션 측면을 테스트해야합니다. 이는 단일 애플리케이션의 눈부신 위반입니다 SOLID 디자인에 관심이 있다면 책임 원칙). 또한보기를 반환하는 컨트롤러로 전통적인 MVC 응용 프로그램을 개발 한 다음 iOS / android / WPF /와 같은 다른 클라이언트 또는 MVC보기를 이해하지 못하는 다른 클라이언트로 응용 프로그램을 확장 할 것인지 결정합니다. WebAPI 데이터 기반 컨트롤러 동작의 보조 집합을 구현하기로 결정하면 적어도 2 곳에서 비즈니스 및 데이터 액세스 논리를 복제하게됩니다.

그럼에도 불구하고 컨트롤러의 모든 비즈니스 및 데이터 액세스 로직을 대체 디자인보다 본질적으로 "악화"로 유지하기로 결정한 것은 아닙니다. 웹 응용 프로그램의 아키텍처를 설계 할 때 결정할 때 장단점이 있습니다. 어떤 경로를 선택하든 항상 상충 관계가 있습니다. 컨트롤러에 모든 애플리케이션 코드를 유지하는 것의 이점은 비용 절감, 복잡성 및 출시 시간 단축을 포함 할 수 있습니다. 매우 단순한 응용 프로그램의 경우 복잡한 아키텍처를 과도하게 설계하는 것이 타당하지 않습니다. 하지만 불행한 점은 개인적으로 간단한 응용 프로그램을 개발하는 즐거움을 결코 얻지 못했기 때문에 컨트롤러에서 비즈니스 및 데이터 액세스 코드를 유지하는 것이 "장기적으로 좋은 설계 결정"이 아닐지는 "일반적인 의견"에 불과합니다.

정말로 대안에 관심이 있으시면 두 기사를 읽는 것이 좋습니다. 이들은 컨트롤러가 소비 할 수있는 명령 및 쿼리 (CQRS) 패턴을 구현하는 방법에 대한 좋은 입문서입니다. EF는 저장소와 작업 단위 패턴을 모두 구현 한 상태이지만 데이터 액세스 코드를 컨트롤러 외부로 옮기기 위해 반드시 포장해야한다는 의미는 아닙니다. 귀하의 프로젝트에 이러한 결정을 내릴 때 행운을 빈다.

public async Task<ActionResult> Index() {
    var user = await query.Execute(new UserById(1));
    return View(user);
}

인기 답변

일반적으로 UnitOfWork 패턴과 함께 저장소 패턴을 선호합니다 ( http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository). work-patterns-in-asp-net-mvc-application ) - UnitOfWork 인스턴스 객체에서 DbContext를 인스턴스화하고 리포지토리에 DbContext를 삽입합니다. 그런 다음 컨트롤러에서 UnitOfWork를 인스턴스화하고 컨트롤러가 DbContext에 대해 알지 못합니다.

public ActionResult Index()
{
    var user = unitOfWork.UsersRepository.GetById(1); // unitOfWork is dependency injected using Unity or Ninject or some other framework
    return View(user);
}



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.