MVC : 비즈니스 로직을 어디에 넣을까요?
우선, 나는 이것에 대한 많은 질문을 보았지만 그 뒤에 충분한 추론이 없습니다. 내 질문이 충분하지 않아 제거해야하는 경우 이해하겠습니다.
나는 한 번 봐 촬영 한 예를 들어, 이 과 45+는 대답 그는 꽤 논리적 소리 모델에서 비즈니스 로직을 넣어 당신을 조언 말한다을 투표했다.
그러나 내 첫 번째 대규모 프로젝트는 컨트롤러에서 모든 BL을 완전히 사용하여 수행했습니다. 왜냐하면 이러한 사항에 의문을 제기하지 않았고 AccountController
양식 인증이있는 MVC를 선택하면 자동으로 추가되는 방법을 살펴 보았 기 때문입니다 . 모든 방법은 BL로 꽤 채워져 있습니다. 아니면 추가 할 수있는 최소한의 코드 일 수도 있고 제가 간과하고있는 것일까 요?
유튜브의 한 사람이 그의 모델에 모든 논리를 담아 그가 옳은지 물었고 처음에는 그렇지 않았습니다! 그런 다음 나는 그가 옳다고 생각하기 시작했습니다!?
결국, 비즈니스 로직은 어디에 두어야합니까? 모델 클래스에 있다면 컨트롤러에있는 메소드에서 얼마나 많은 코드가 정상으로 간주되어야합니까? 컨트롤러의 모델에서 일부 메서드를 호출 한 다음 뷰로 돌아가는 한 줄?
몇 가지 이유로 모델에 도메인 로직을 넣는 것을 선호합니다.
모델에는 UI 코드가 없어야하므로 테스트하기가 더 쉽습니다. 가능할 때마다 UI 코드를 작성하기 전에 완전히 작동하는 (완전한 테스트 범위를 의미) 모델을 갖고 싶습니다. 컨트롤러는 모델이 올바른 일을하고 있다고 믿고 UI 문제 만 처리 할 수 있습니다.
컨트롤러에 도메인 논리를 배치하면 다른 앱간에 또는 다른 컨트롤러간에 공유하기가 쉽지 않습니다.
나는 내 모델을 속성과 비즈니스 로직없이 깨끗하게 유지하는 것을 좋아합니다. 나는 항상 컨트롤러에 종속성을 주입하는 것이 좋다고 생각하며 이러한 종속성에는 내 모델에서 수행하는 논리가 포함되어 있습니다. 가능한 경우 단일 책임 원칙을 고수하는 것을 좋아하며 수많은 방법을 가진 모델이 매우 빠르게 부풀어 오르는 것을 발견했습니다. 둘 다 장점과 단점이 있습니다. 많은 종속성을 주입하면 오버 헤드가 발생하지만 격리 된 상태에서 테스트 할 수 있고 클래스를 단순하게 유지하고 결국 더 간결한 컨트롤러를 갖게됩니다. 내 논리는 클래스의 구성원으로 모델에 실제로 존재하지 않지만 여전히 비즈니스 논리입니다. Httpcontext와 같은 것을 조롱하는 것은 약간 악몽이고 불필요하기 때문에 컨트롤러에 비즈니스 로직을 정의하지 않는 경향이 있습니다.
비즈니스 로직은 문제의 도메인이 간다 속하는 문제 도메인과 모든에 속하는 모델 MVC한다.
컨트롤러는 뷰와 모델에보기 뒷면에서 모델로부터 데이터를 전달하는 책임을 져야한다. 따라서 컨트롤러는 사용자가 상호 작용하는 것과 프로그램이 문제의 상태를 모델링하고 저장하는 방법 사이의 다리 역할을합니다. 배관 , 말하자면.
여기서 핵심은 비즈니스 로직과 배관 로직의 차이입니다. 제 생각에는 자동 생성 된 계정 컨트롤러가하는 일은 실제로 비즈니스 로직이 아니라 대부분 배관 작업입니다. 배관 논리가 반드시 짧지 않아도되므로 인위적인 제한 (예 : "컨트롤러에서 최대 X 호출 횟수")을 부과 할 필요가 없습니다.
우리 팀은 웹 양식 (asp.net)에서 mvc로 옮겼을 때 많은 연구를 수행하고 다음 구조를 생각해 냈습니다. 나에 따르면 응용 프로그램이 얼마나 크거나 작은 지에 대한 것이 아닙니다. 코드를 깨끗하고 명확하게 유지하는 것입니다.
DAL 프로젝트
AccountsDAL.cs --- > Calls SP or any ORM if ur using any
BLL 프로젝트
AccountsBLL.cs ---> Calls DAL
WebProject
Model
AccountsModel --- > Contains properties And call BLL
Controllers
IndexController ---> Calls Models and returns View
Views
Index
컨트롤러 는 모델과 뷰 사이에 전달되는 데이터를 담당해야합니다. 그 외에는 불필요한 코드가 없어야합니다. 예를 들어 로깅하는 경우 컨트롤러가 아닌 모델 수준에서 수행해야합니다.
이 주제에 대해 약간의 혼란이있는 것 같습니다. 대부분 사람들은 MVC 패턴을 N 계층 아키텍처와 혼동하는 경향이 있습니다. 현실은 두 가지 접근 방식을 함께 사용할 수 있지만 하나는 다른 접근 방식에 의존하지 않으며 둘 다 필요하지 않습니다.
N 계층 아키텍처는 응용 프로그램을 여러 계층으로 분리하는 것과 관련이 있습니다. 간단한 예는 애플리케이션이 프레젠테이션 계층, 비즈니스 논리 계층 및 데이터 액세스 계층으로 분할되는 경우입니다.
MVC는 애플리케이션의 표현 계층을 다루는 디자인 패턴입니다. 프레젠테이션 계층에서 비즈니스 로직과 데이터 액세스 로직을 분리하지 않고도 MVC 접근 방식에 따라 애플리케이션을 설계 할 수 있으므로 단일 계층 설계로 끝납니다.
결과적으로 애플리케이션을 계층으로 분리하지 않고 MVC 접근 방식을 따르는 경우 비즈니스 규칙 및 데이터 액세스 논리의 비트가 나머지 논리와 혼합 된 모델,보기 및 컨트롤러로 끝납니다.
정의에 따라 N 계층 아키텍처에서 프레젠테이션 계층은 비즈니스 논리 계층과 만 통신 할 수 있어야하므로 MVC 구성 요소 중 하나가 비즈니스 논리 계층과 만 통신 할 수 있어야합니다.
프리젠 테이션을 포함하지 않고 따라서 프리젠 테이션 계층이 아닌 애플리케이션을 빌드하는 경우 MVC 패턴에 대해 걱정할 필요가 없습니다. 그러나 프레젠테이션 레이어가 포함되어 있지 않더라도 애플리케이션을 여러 계층으로 분할하여 N 계층 설계를 따를 수 있습니다.
일반적으로 비즈니스 로직은 MVC 플레이어에 있어서는 안됩니다. 컨트롤러 작업에 의해서만 소비 되어야합니다 .
많은 사람들이 언급했듯이 비즈니스 로직을 클라이언트에 구애받지 않는 재사용 가능한 구성 요소 집합으로 호스팅하는 라이브러리를 만드는 것이 가장 좋습니다.
이렇게하면 소프트웨어의 재사용 성, 호환성, 확장 성 및 테스트 가능성이 크게 향상됩니다. 또한 특정 프레임 워크 기능에 대한 의존도를 줄여 최신 / 다른 기술로 쉽게 마이그레이션 할 수 있습니다.
비즈니스 로직을 독립형 어셈블리 (또는 어셈블리)로 추상화하는 것은 수년 동안 우리에게 많은 도움이되었습니다. 그러면 우리의 비즈니스 로직은 거의 모든 .NET 기술 (ASP.NET MVC / API / Core, WPF, Win Forms, WCF, UWP, WF, Console 등)에서 사용할 수 있습니다.
또한 .NET MVC 프레임 워크에 대한 종속성을 줄이기 위해 비즈니스 규칙 및 유효성 검사 논리를 처리하는 중간 계층을 선호합니다. 예를 들어, 우리는 .NET MVC 유효성 검사 도우미를 사용하지 않고 대신 자체적으로 의존합니다. 이는 모든 .NET 기술에서 비즈니스 로직을 쉽게 사용할 수있는 또 다른 요소입니다.
이러한 방식으로 중간 계층을 논리적으로 설계함으로써이 물리적 아키텍처를 쉽게 달성 할 수있었습니다.
그것은 Peasy.NET 으로 작성되었으며 수년 동안 우리에게 잘 봉사했습니다. 사실 우리는 그것을 오픈 소스로 결정했습니다.
중간 계층이 어떻게 생겼는지 궁금한 사람이 있다면 다음 은 클라이언트에 구애받지 않는 비즈니스 계층 의 샘플 입니다. 또한 여러 .NET 클라이언트 (ASP.NET MVC, Web Api 및 WPF)의 소비를 보여줍니다.
이것이 누군가를 돕기를 바랍니다!
I like to keep my models clean as well (ref: @Mark Walsh). The problem of not being able to reuse logic embedded in controllers can easily be overcome through dependency injection, or, if you think there would be too much of that, expose your business/domain logic through interfaces and use the façade pattern in the controllers. That way you get the functionality you need, but keep both the controllers and model nice and clean.
I would also prefer to keep models clean. The MVC controllers should be used only to make calls and should also be kept clean. So depending upon its reusability, sensitivity and relevance the business logic can be written in
1.WebApi Controller: The advantage of using a webapi controller is that you can expose these as services later to other devices making your code reuseable.
2. BAL / Common commonent: There are some logics which have specific usage and cannot be exposed as an api, can be pushed in this class.
3. Repository: All the database related queries are added in a repository. There can be a generic repository which will implement all the functions (CRUD operations)or specific repositories for each table. Depending upon the operations to be performed.
As ahanusa wrote, you should put your business logics into separate DLL or separate directory.
I often use a directory named Logics at same level of Models and Controllers where I put classes which do business logics.
In this way I let both models and controllers clean.
The general answer I have is that business logic normally fits into two categories:
Object Oriented Business Logic: Gets modeled as objects (in the model), usually injected as repositories.
Procedural Business Logic: Goes in a service with an interface that can be injected into a controller.
Controller Logic: Logic that controls how commands are received and passed to the models/services, then how those results are passed to the view.
Controllers should have no business logic, it's a very specific part of a design pattern for controlling how a user interface passes input off to the models that handle business logic (or services if your problems are more procedural in nature).
The business logic should not go in your Models Views or Controllers. There should be a separate Business Logic Layer ; the sole purpose of this layer is to handle your business logic. This is more in-line with SOLID.
If you were to put your business logic in M V or C, you end up with code that is difficult to test / reuse.
I know that it's a question about MVC, but I think the example I'm giving (Web API) will be usefull.
I'm developing my first Web API and I'm re-using the business logic from other applications. To be specific, it comes from an external DLL, so my API is used just to "talk" with a SAP solution, receiving requests from PO and send responses back.
How could I put my logic (already implemented) into my controller? I don't need it. My controller will only receive, validate requests and compose responses to send data back.
I'm working with ViewModel classes and all they must have is a mapping function, just to read information from TransferObjects (that comes from the external DLL) and translate to a ViewModel.
I'm not comfortable with my application (in this case Web API) holding the business logic, I think that the re-usability will be lost in this way.
I'm treating my business logic as a dependency that I inject into controller.
I've done a lot of refactoring in the legacy to provide a Unit Testable solution, I had to create a lot of interfaces and implement some design patterns into the legacy to provide this solution.
In my point of view, the business layer must be apart of the application, preferably in another class library. So you will have a real separation concept implemented in your application.
Of course, if your CORE (business) is your application (API/WebSite), the business rules will be implemented into your MVC classes. But in the future if you want to develop a new app and some business rules are the same, I bet you will have a lot of problems just to maintain the same logic implemented in both applications.
참고URL : https://stackoverflow.com/questions/18563229/mvc-where-to-put-business-logic
'code' 카테고리의 다른 글
Cygwin 오류 : "-bash : 포크 : 재시도 : 리소스를 일시적으로 사용할 수 없음" (0) | 2020.11.17 |
---|---|
"res.send"후에 코드를 실행할 수있는 이유는 무엇입니까? (0) | 2020.11.17 |
jQuery UI 자동 완성 위젯 검색 구성 (0) | 2020.11.17 |
반사를 통해 개체의 필드를 가져 오는 방법은 무엇입니까? (0) | 2020.11.17 |
android의 webview에서 onclick 이벤트를 어떻게 얻을 수 있습니까? (0) | 2020.11.17 |