1

3 계층 모델 (프레젠테이션 - 비즈니스 데이터 액세스 계층)에서 하위 계층을 상위 계층과 상관없이 일관되게 유지할 수 있습니다. 예를 들어 나의 데이터 액세스 레이어는 그것이 어떻게 표현되는지 또는 어떤 busines 규칙이 그것에 대해 작동되는지를 결코 알지 못합니다. 내 비즈니스 규칙은 그들이 제시되는 방식에 불가 지합니다.프리젠 테이션 레이어 (특히 .NET)에서 그리드를 사용할 때 어떻게 염려를 분리 할 수 ​​있습니까?

하지만 용서를 위해 Demeter에게기도해야합니다. 또는 적어도 한 가지 조언에 대해 동료 Stackoverflow 회원에게 물어보십시오. 프레젠테이션 계층에서 데이터 액세스 개체를 참조하지 않고 어떻게 사용자에게 "표"를 제공합니까? 때때로 나는 GridView 객체에서 ADO.NET DataTable을 참조하고 있습니다. 현재 두 레이어에서 타사 도구를 사용하고 있습니다. 이 테이블은 OpenLink의 OpenComponents Table 객체에서 가져온 것입니다. 그리드는 Infragistics UltraGrid (Windows 플랫폼)입니다. 그러나 나는 같은 위반에 대해 유죄입니다.

편집 : 가장 특별한 관심사는 WinForm 3.5 .NET입니다. 아래에 내 의견을 적어 두십시오 : 나는 주석에있는 링크가 내가 수행해야만한다고 생각하지만, 나는 도메인 객체로 너무 멋지게되지 않아야한다고 생각했습니다. 나는 과도한 디자인으로 비난 받고 싶지 않습니다. 이게 좋은 균형입니까?

+0

: 발표자는 다음과 같이 보일 것이다 :

public class ListClientsPresenter { IListClientsView View; public ListClientsPresenter(IListClientsView view) { this.View = view; } public void LoadView() { View.Title = "List of Clients"; View.Clients = new List<Client> { new Client {Name = "Client 1"}, new Client {Name = "Client 2"} }; } } 

이것은 매우 간단한 예를 들어, 당신은이 문서를 확인해야합니다 구현 세부 사항. – MedicineMan

+0

Windows Forms .NET 3.5로 제한됩니다. 데이터베이스 객체는 재무 및 석유 및 가스 거래와 관련된 도메인 인 OpenComponents 메모리 테이블입니다. 이것이 내가 처음 읽어야 할 것으로 생각됩니다. "방법 : Windows Forms DataGridView 행에 바인딩 된 개체에 액세스" – Blanthor

답변

1

테이블을 나타내는 데이터 형식을 사용하는 대신 데이터 전송 개체를 사용합니다. 이것은 데이터의 논리적 구조를 나타내는 객체입니다. 그것은 데이터를 포함 할 것입니다.

이 경우에는 "데이터 행"유형에 대해 DTO를 정의한 다음 격자에 전달할 유형으로 List<RowDTO>을 사용합니다.

+0

나는 이것이 얼마나 쉬운 지 놀라 울뿐입니다. 그리드에는 속성을 추가하지 않고도 모든 공용 속성에 대한 열이 자동으로 표시됩니다. 약간의 복잡성이 추가되었으므로 이제는 함께 작업 할 수있는 유용한 SoC가 생겼습니다. – Blanthor

0

다른 stackoverflow 멤버가 어떻게할지 모르겠지만 WPF, ASP MVC, Silverlight, MVVM 디자인 패턴을 사용하면됩니다. 나는 당신에게 그 순간 좋은 링크가 없다고 생각합니다.

MVVM에서 핵심 아이디어는 View가 ViewModel의 데이터에 액세스한다는 것입니다. ViewModel은 속성을 노출하여 뷰에 데이터를 표시합니다. WPF 및 Silverlight에서 바인딩을 사용하여 데이터에 액세스하고 데이터 템플릿을 사용하여 표현 방법에 대한 정확한 세부 정보를 표현합니다. 일반적으로 ObservableCollection 인 컬렉션을 노출합니다. ASP MVC에서는 컨텍스트 스위치를 사용하고 그런 식으로 모델에 액세스합니다.

<body> <h1><% Model.MyHeaderMessage %></h1> 

나는 당신이 할 일은 (컨트롤러와 유사) 당신의 ViewModel에 있음을 말할 것입니다 데이터의 서버/서비스를 공격하고 레코드를 반환합니다. 간단한 데이터 클래스에서 데이터를 다시 패키징 한 다음 ObservableCollection에 넣으면 ObservableCollection을 반환하는 속성을 통해 뷰에 표시됩니다. ASP MVC를 수행하는 경우 IEnumerable을 반환하는 속성을 통해 데이터를 노출하십시오.

0

매우 일반적인 패턴은 Model View Presenter 패턴 (MVP)입니다.

여기서 핵심은보기를 나타낼 인터페이스를 정의하는 것입니다. 예를 들어보기에 속성이있을 수 있습니다.

그리고보기와 모델 간의 의사 소통을 담당해야하는 발표자.

internal interface IListClientsView 
{ 
    public string Title { set; } 
    public IList<Client> Clients { set; } 
} 

그리고이 될 것이라고 웹 형태의 구현 :

public partial class WebForm1 : System.Web.UI.Page, IListClientsView 
{ 
    ListClientsPresenter presenter; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     presenter = new ListClientsPresenter(this); 
     if (!Page.IsPostBack) 
      presenter.LoadView(); 
    } 

    public IList<Client> Clients 
    { 
     set { GrvClients.DataSource = value; 
     GrvClients.DataBind(); 
     } 
    } 
} 

은 물론,이 또한의 WinForm 수

그래서 뷰는 다음과 같이 될 것이다.중요한 것은 WinForm이 IxxxView 인터페이스를 보완하고 관련된 발표자를 호출하는 것입니다. 당신은 당신이 사용하고자하는 기술을 지정하는 경우, 답변자가 조금 더 디테일을 제공 할 수 http://msdn.microsoft.com/en-us/magazine/cc188690.aspx

+0

원래이 종류의 복잡성을 프로젝트에 추가하는 것이 두려웠습니다. 이 패턴을 더 읽고 나면 MVP로 리팩터링 할 수 있습니다. 나는 Boodhoo의 예제가 DTO를 모델에서 사용한다는 것을 알아 차렸다. – Blanthor

+0

요즘에는 MVVM Model-View-ViewModel이라는 매우 일반적인 패턴이 있습니다. DTO 대신 ViewModel 클래스라는 클래스를 만들어 인터페이스를 나타냅니다. MVP를 사용하는 편이 좋지만 옵션 일 뿐이지 만 이것은 단지 의견 일 뿐이므로 최선의 방법을 선택해야합니다. 결국,은 총알은 없습니다;) – vintem

관련 문제