웹 애플리케이션이 있습니다. 나는 기술이 중요하다고 생각하지 않습니다. 구조는 왼쪽 이미지에 표시된 N 계층 응용 프로그램입니다. 3 개의 레이어가 있습니다.
UI (MVC 패턴), BLL (Business Logic Layer) 및 DAL (Data Access Layer)
내가 가진 문제는 응용 프로그램 이벤트 호출을 통한 논리와 경로가 있기 때문에 BLL이 방대하다는 것입니다.
응용 프로그램을 통한 일반적인 흐름은 다음과 같습니다.
UI에서 발생한 이벤트, BLL의 메소드로 이동하고 논리 (BLL의 여러 부분에서)를 수행하고 결국 DAL에서 BLL (더 많은 논리)로 돌아가서 UI에 일부 값을 리턴합니다.
이 예제의 BLL은 매우 바빠서 이것을 어떻게 나누는 지 생각하고 있습니다. 나는 또한 내가 싫어하는 논리와 객체를 결합했습니다.
오른쪽 버전은 나의 노력입니다.
논리는 여전히 응용 프로그램이 UI와 DAL간에 흐르는 방식이지만 속성은 없을 것입니다 ... 메서드 만 (이 계층의 대부분의 클래스는 상태를 저장하지 않으므로 정적 일 수 있음). Poco 레이어는 속성이있는 클래스가 존재하는 곳입니다 (예 : 이름, 나이, 키 등이있는 Person 클래스). 이것들은 응용 프로그램의 흐름과 관련이 없으며 상태 만 저장합니다.
흐름은 다음과 같습니다.
UI에서 트리거되고 일부 데이터를 UI 계층 컨트롤러 (MVC)에 전달합니다. 이는 원시 데이터를 변환하여 poco 모델로 변환합니다. 그런 다음 poco 모델은 논리 계층 (BLL)으로 전달되고 결국에는 명령 쿼리 계층으로 전달되어 잠재적으로 도중에 조작됩니다. 명령 쿼리 계층은 POCO를 데이터베이스 개체 (거의 같은 것이지만 하나는 지속성을 위해 설계되고 다른 하나는 프런트 엔드를 위해 설계됨)로 변환합니다. 항목이 저장되고 데이터베이스 개체가 명령 쿼리 계층으로 반환됩니다. 그런 다음 POCO로 변환되어 로직 레이어로 돌아와 잠재적으로 더 처리 한 다음 마지막으로 UI로 돌아갑니다.
공유 로직 및 인터페이스는 MaxNumberOf_X 및 TotalAllowed_X 및 모든 인터페이스와 같은 지속적 데이터를 보유 할 수있는 곳입니다.
공유 로직 / 인터페이스와 DAL은 모두 아키텍처의 "기본"입니다. 이들은 외부 세계에 대해 아무것도 모른다.
공유 로직 / 인터페이스 및 DAL 이외의 모든 포코에 대해 알고 있습니다.
흐름은 여전히 첫 번째 예제와 매우 유사하지만 각 레이어가 하나의 상태 (흐름, 흐름 또는 다른 것)를 더 책임지게합니다 ...하지만이 접근법으로 OOP를 깨고 있습니까?
Logic과 Poco를 시연하는 예는 다음과 같습니다.
public class LogicClass
{
private ICommandQueryObject cmdQuery;
public PocoA Method1(PocoB pocoB)
{
return cmdQuery.Save(pocoB);
}
/*This has no state objects, only ways to communicate with other
layers such as the cmdQuery. Everything else is just function
calls to allow flow via the program */
public PocoA Method2(PocoB pocoB)
{
pocoB.UpdateState("world");
return Method1(pocoB);
}
}
public struct PocoX
{
public string DataA {get;set;}
public int DataB {get;set;}
public int DataC {get;set;}
/*This simply returns something that is part of this class.
Everything is self-contained to this class. It doesn't call
trying to directly communicate with databases etc*/
public int GetValue()
{
return DataB * DataC;
}
/*This simply sets something that is part of this class.
Everything is self-contained to this class.
It doesn't call trying to directly communicate with databases etc*/
public void UpdateState(string input)
{
DataA += input;
}
}