프로젝트의 GUI, BLL, DAL 조직


9

응용 프로그램 계층에 대해 읽고 있는데 다음 프로젝트 (c #, .Net)에서이 디자인을 사용하고 싶습니다. 몇 가지 질문 :

  1. 네임 스페이스를 통해 레이어를 분리합니까? Project.BLL. 무엇이든, Project.DAL. 무엇이든

  2. 레이어, 컴포넌트 (Project.BLL.Component1) 또는 컴포넌트, 레이어 (Project.Component1.BLL)로 구분하는 것이 더 적합합니까?

  3. 내 DAL의 경우이 계층이 다른 클래스를 사용하여 추가로 구성됩니까? 모든 데이터베이스 호출이 단일 클래스에 배치되면 조직이 없습니다. 이것을 다른 클래스 또는 네임 스페이스로 나누는 것이 더 좋습니까?

  4. DAL 클래스는 일반적으로 정적입니까? 매번 메서드 중 하나를 호출하기 전에 DAL 개체를 인스턴스화하는 것은 번거로운 것 같습니다.

이 레이어로 올바른 방식으로 작업을 수행하는 다른 팁을 주시면 감사하겠습니다.

답변:


8
  1. 예. 또한 어셈블리.
  2. 레이어와 컴포넌트로 구분합니다.
  3. 예. 이것에 대한 다른 접근 방식이 있지만 IDatabaseService (데이터베이스가 호출되는 다양한 방식을 요약 합니다-ExecuteScalar / ExecuteNonQuery / ExecuteReader의 거의 직접 매핑 일 수 있음)와 다양한 데이터 액세스 클래스가 있습니다. 데이터 유형별 파티션. 예를 들어, User 객체를 생성 / 수정 / 삭제하는 간단한 CRUD 메소드를 가진 UserDataAccess 클래스를 가질 수 있습니다. 또 다른 방법은 CRUD가 내장 된 User 객체를 사용하는 것입니다.
  4. 아닙니다 . 이렇게하면 단위 테스트가 훨씬 어려워집니다. 종속성 주입 을 사용 하여 각 데이터 액세스 클래스 (예 : IDatabaseService)의 생성자에 종속성을 전달 해야합니다 . 그런 다음 데이터 액세스 오브젝트를 다음과 같이 비즈니스 오브젝트로 전달하십시오.

    BusinessObject businessObject = 새 비즈니스 개체 (새 데이터 액세스 개체 (새 데이터베이스 서비스 ())); businessObject.PerformOperation ();

각 비즈니스 오브젝트에는 여러 데이터 액세스 오브젝트가 필요할 수 있습니다. GUI 코드는 또한 하나 이상의 비즈니스 객체를 사용합니다. 일부 비즈니스 오브젝트에는 데이터 액세스 오브젝트가 필요하지 않지만 IDatabaseService를 직접 사용해서는 안됩니다.


따라서 DataAccessObject의 인스턴스가 businessObject에 존재하기 때문에 businessObject.PerformOperation ()은 DataAccessObject.PerformOperation ()과 같습니다.
sooprise 2016 년

1
또한 의존성 주입에 대한 팁에 감사드립니다. 그것은 저에게 새로운 개념이며, 이해가되는 것 같습니다. 나는 :) 그것에 대해 더 배워야 할 것
sooprise

@sooprise-비즈니스 개체는 개인 구성원으로 존재하는 데이터 액세스 개체에서 작동해야합니다. 의존성 주입에 대한 팁을 주셔서 감사합니다. 유지 관리 가능하고 테스트 가능한 소프트웨어 디자인을위한 중요한 개념입니다. 당신은 가장 환영합니다!
Matthew Rodatus 2016 년

2

1 번과 2 번 문제는 Matthew의 답변과 함께하십시오.

데스크톱 응용 프로그램의 DAL을 구성하는 가장 좋은 방법을 알아 내려고 많은 시간을 보냈습니다. 그리고 가장 좋은 방법은 실제로 응용 프로그램의 요구에 달려 있습니다. 내 응용 프로그램 중 하나에서 각 데이터베이스 테이블에 대해 DA 클래스를 사용하여 중앙 (즉, 단일 톤) DataProvider 클래스에 등록하고 CRUD를 처리했습니다. 그런 다음 각 DA 클래스는 모든 테이블 데이터를 RAM에 캐시할지 여부 (성능!) 및 / 또는 다른 컴퓨터에서 실행중인 다른 클라이언트에서 자동 클라이언트 업데이트를 트리거 할 수 있는지 여부를 결정할 수 있습니다 (다중 사용자 생각) 동시성). 등록 인터페이스를 준수하기 만하면 새로운 DAL 클래스를 추가하기가 매우 쉽습니다.

모든 DAL이 이런 종류의 기능을 필요로하는 것은 아니지만, 접근 방식 자체 (예 : 싱글 톤 데이터 공급자 및 정적 등록이있는 간단한 DAL 클래스)는 새 클래스를 추가하기 시작할 때 내 인생이 훨씬 쉬워 졌다는 것을 알게되었습니다.

매우 간단한 응용 프로그램이 아니라면 CRUD를 더 높은 수준의 클래스로 작성하는 것은 권장하지 않습니다. DAL은 데이터 스토리지의 추상화입니다. 향후 MS SQL 대신 MySQL 만 사용하더라도 데이터 스토리지를 변경하기로 결정한 경우 매우 감사하겠습니다. 또한 BLL 개체는 비즈니스 논리 관계에 의해 구성되어야합니다. DAL 개체는 해당 개체가 나타내는 저장소 컨테이너 유형으로 구성됩니다. 차이점은 극적 일 수 있습니다.

마십시오 하지 당신의 DAL 클래스의 정적을합니다. 코딩 속도가 향상되면 테스트 가능성과 유연성면에서 여러 번 잃게됩니다.


특정 디자인은 응용 프로그램의 요구에 따라 결정됩니다. 그러나 디자인을 잘못 이해하지 않으면 싱글 톤 사용에 동의하지 않습니다. 어쩌면 당신은 당신의 접근 방식을 더 설명 할 수 있습니다. 왜 싱글 톤은 악 : blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx
마태 복음 Rodatus

미안하지만 싱글 톤에 동의하지 않습니다. 그것들을 사용해야 할 이유가 매우 많으며, 블로그에 언급 된 모든 것들이 코딩에 필요한 규칙을 적용하고 싶지 않은 누군가의 변명처럼 들립니다.
wolfgangsz 2016 년

내 접근 방식에 대한 자세한 설명은 여기에 의견으로 제공 할 수있는 것보다 훨씬 많이 채울 것입니다. 귀하의 이메일 주소를 보내 주시면 회신을 드릴 것입니다 (wolftis at manticoreit dot com)
wolfgangsz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.