0

실용적인 방법으로 모범 사례를 사용하는 방법을 보여주는 개발중인 Github 프로젝트가 있습니다. 그러나 나는 개념에 문제가있다. 내가 할 때, 나는 기초로 바로 돌아가고 간단한 예제를 시도한다. 프로젝트가이 링크를 보려면 :C# MVC 응용 프로그램에 비즈니스 레이어를 추가하는 방법

https://github.com/franasm/Store.git

실무 분기 DI/IOC가 완전히 작동있다. 깨진 지점은 단순한 비즈니스 계층을 추가하려고했을 때 일어난 일입니다. 그래서 나는 기초로 돌아갔다.

나는 늪지 표준 단순 MVC4 응용 프로그램을 만들었습니다. 그런 다음 단일 테이블 (위 프로젝트의 제품 테이블)과 함께 EF5를 추가했습니다.

나는 DI/IOC 또는 멋진 것들없이 비즈니스 계층을 추가하기로 결정했다. 그러나 그 개념은 단지 나를 혼란스럽게합니다.

이 예제에서 원하는 것은 제품 클래스를 확장하고 TaxAmt라는 속성을 추가 한 다음 클래스가 인스턴스화 될 때 TaxAmt를 계산하는 메서드를 추가하는 것입니다.

다양한 방법으로 시도했지만 모든 종류의 오류가 발생합니다. 스택 오버플로 실행에서 예외를 설정하지 않는 예외. 대부분의 경우 Product.Price 필드가 초기화되지 않았기 때문에 값이 표시되지 않습니다.

나는 또한 나의 BL이 잘못된 위치에 있음을 발견 :

내 모델 다음,
다음 내 BL,
내 컨트롤러가 있습니다.

이 작은 예는 괜찮습니다. 그러나 내가 취할 수있는 실제 예제에 가장 근접한 것은 EF에 의해 생성 된 이미 존재하는 클래스의 부분 클래스를 생성하는 것이므로 DI/IOC를 사용하기 위해이를 분리 할 때 BL이 인터페이스의 잘못된면에있게 될 것이기 때문에 Model 클래스 (부분 클래스)의 일부가됩니다.

내가 분명히처럼 분리 제 층 싶은

:
EF 모델 클래스,
인터페이스,
리포,
BL,
컨트롤러,
ViewModels,
보기.

Repo가 중요한 작업을 담당하기 때문에. BL은 이것을 기반으로해야합니다. 제품 세부 정보 (가격 중 하나)가 읽힌 후 BL은이 정보를 가져와 세금 계산을 한 다음 컨트롤러에서 사용할 수 있습니다.

제 생각이 맞는지 확실하지 않습니다.

대부분의 경우 BL이 모델의 일부가되어야한다고 강력하게 동의하지 않습니다. 그러나 이것이 위에서 설명한 나의 고안된 사례의 경우 일지라도. 나는 아직도 그것을 작동시키지 않는다. 그러나 모델 클래스를 상속하고 확장 한 다음 repo와 함께 사용하는 방법에 대한 해결책을 찾고있을 것입니다. 그러나 이것은 나를 다시 원으로 인도한다. crud는 BL에 액세스 할 수없는 repo 계층에서 수행되므로 BL을 초기화하여 세금 계산을 수행하는 방법은 무엇입니까? 객체를 두 배로 늘리지 않고, 각 모델 인스턴스의 POCO와 동일한 객체의 BL 인스턴스를 두 배로 늘리십시오.

정말 혼란 스러워요 ...

필자가 말 그대로했던 것은 단순한 테이블, 간단한 mvc 프로젝트, EF5 모델 추가, 모든 작업을 완료하여 작동하는지 확인했기 때문에 코드를 포함하지 않았습니다. 그런 다음 설명한대로 BL을 추가하려고 시도했습니다. 모델의 부분 클래스 (이상적이지 않음)로 정의되거나 모델 클래스를 직접 상속 한 BL 폴더의 단일 클래스 (이 클래스가 차가운 지 확실하지 않음) 이상적으로 저는 DI를 사용하여 내 BL에 내 repo를 주입 한 다음 내 컨트롤러에 BL을 주입 할 수 있기를 원합니다.

누구든지이 작업을 수행하는 방법을 알고있는 경우 단계별 지침 (및 선호하는 샘플 코드) 또는이 프로세스를 수행하는 방법에 대한 설명과 이유에 대한 설명을 제공하여 답변을 제공해 주시겠습니까? 그래서 혼란스러워.

미리 도움을 청하십시오.

답변

0

그래서 비즈니스 계층과 EF 계층이있는 MVC 응용 프로그램을 만드는 가장 좋은 방법은 3 계층 레이아웃을 사용하는 것입니다.

우리는 EF 프로젝트 (SSDT 또는 유사 할 수도 있음), "서비스"레이어 (실제 웹 서비스 일 수도 있지만 일반 클래스 출력 DLL 일 수도 있음) . 때로는 이것을 "상담원"레이어라고도합니다. 클래스는 여기에서 모델을 호스팅하고 모델을 EF 코드에서 해당 모델로 변환합니다. 여기에 사용 LINQ의 예는 다음과 같습니다

public static BlogModel GetBlog(string ID) 
    { 
     Blog b; 
     using (Entities cm = new Entities()) 
     { 
      b = cm.Blogs.Where(blog => blog.ID == ID).FirstOrDefault(); 
     } 

     if (b != null) 
      return GetBlog(b); 

     return null; 
    } 

그래서이 방법은 SQL에 EF와 LINQ를 사용하여 데이터베이스에서 블로그 개체를 얻을 것이다. 이제 이것을 모델로 바꾸는 것 :

public static BlogModel GetBlog(Blog blog) 
    { 
     return new BlogModel() 
     { 
      Title = blog.Title, 
      Enabled = blog.Enabled 
     }; 
    } 

물론이 경우에도 Title 및 bool 문자열이 활성화 된 BlogModel 객체가 사용됩니다. 예와 같이.

이제 비즈니스 모델에는 모델을 반환하는 두 가지 메소드가 있습니다. 당신은 지금과 같이 컨트롤러에이를 호출 할 수

[Route("/Blogs/{id}", RouteName = "Blogs")] 
     public ActionResult ViewBlogs(string id) 
     { 
      BlogModel m = BusinessNamespace.BlogClass.GetBlog(id); 
      return View("Blogs", m); 
     } 

을 이제 사용자가 설정 올바른 모델로 Blogs.cshtml보기가 가정, 당신이 가서 잘되어야합니다.

일부 도움이 되길 바랍니다.

+0

아마도 나는 완전히 이해하지 못했습니다. 코드의 중간 블록을 모델이라고 부릅니다. 코드의 첫 번째 블록은 제 저장소를 고려할 것입니다. 마지막 블록은 당신이 컨트롤러라고 말한 것입니다. 처음 두 모델은 나에게 혼란을줍니다. 여기에서 설명하는 방식으로, 레포가 먼저 오는 것처럼 보입니다. 그렇다면 테이블의 구조는 어디에서 얻을 수 있습니까? 동일한 이름으로 처음 정의 된 EF 클래스가 있습니까? 이 경우 코드의 중간 블록은 BL이 될 수 있지만 그 다음 3 블록의 코드가 모두 같으면 혼란 스럽습니다. –

+0

예, 이것은 EF를 사용하고 있습니다 (귀하가 신용을 부여하는 것 이상을 이해함). 그리고 무엇인가의 이유로 (아마도 시간이었습니다), 나는 이것이 분명하다고 생각했습니다. 나는 그렇지 않다는 것을 알 수있다. 미안합니다. – DorkyMork