2009-06-17 3 views
0

현재 여러 가지 GUI 필드를 객체 속성 (즉, 프리젠 테이션 레이어를 비즈니스 로직 레이어 매핑으로 매핑)에 문제가 있습니다. 더 구체적으로 VB.NET 2.0 WinForms입니다.GUI 대 비즈니스 객체 매핑 VB.Net

해결책의 성격에 따라 GUI에서 동일한 유형의 동작을 나타내는 4 개의 열이 있어야합니다. 각 열은 11 개의 텍스트 상자로 구성됩니다 (문제가 11 개의 텍스트 상자를 초과하므로이 작은 샘플 크기를 사용합니다).).

내가 현재 지금과 같은 값으로 모두 네 개의 열에서 각 텍스트 상자의 태그를 설정하는 것입니다 뭐하는 거지 :

이벤트가 텍스트 상자 (예 : 키 누름)에 의해 발생
Textbox1.tag = "name" 
Textbox2.tag = "type" 
Textbox3.tag = "speed" 

, 내가 볼 부모 컨테이너. 태그를 특정 객체에 매핑하는 문자열로 설정했습니다. 필자는 텍스트 상자의 태그와 함께 이것을 사용하여 어떤 객체의 속성을 설정해야하는지 결정합니다. 전반적으로 다음과 같이 보입니다.

dim objectToMapTo //the generic parent object which all my custom myObjects inherit from 

select case sender.parent.tag //the parent object that the property needs to map to 
    case "column1" 
     objectToMapTo = myObject1 
    case "column2" 
     objectToMapTo = myObject2 
    case "column3" 
     objectToMapTo = myObject3 
    case "column4" 
     objectToMapTo = myObject4 
end select 

select case sender.tag //the actual textbox's tag value which maps to the property 
    case "name" 
     objectToMapTo.Name = sender.text //sender.text is conceptual for 
     //the data that needs to be set -- i.e. this could be a calculated 
     //number based on the text, or simply a string, etc 
    case "type" 
     objectToMapTo.Type = sender.text 
    case "speed" 
     objectToMapTo.Speed = sender.text 
    ... 
end select 

위의 내용에서 알 수 있듯이 매우 시끄럽고 오히려 빨리 발생할 수 있습니다. 현재 매핑 할 수있는 이상한 속성을 43 개 설정했습니다. 따라서 select 문은 매우 길며 많은 것들이 DRY를 시도하고 시도하는 여러 메서드에 포함되어 있습니다 (코드를 본질적으로 개념적으로 이행).

질문 : 어떻게 이것을 리팩터링 할 수 있습니까? 나는 사전/해시를 어느 정도 사용하려고 시도했지만 지나치게 복잡해 졌거나 문제가 더 복잡해 짐에 따라 구현이 단순하지 않았습니다.

도움 주셔서 감사합니다.

답변

1

태그를 객체로 설정하여 첫 번째 문제가 발생했습니다. 태그는 문자열이 아니고 객체 유형입니다.

그리고 반사에 의한 두 번째 문제는 태그의 값보다 반드시 propertyname과 정확하게 일치해야합니다.

_objectToMapTo.GetType().InvokeMember(sender.tag,BindingFlags.Instance Or BindingFlags.Public,Nothing, _objectToMapTo, New Object() {sender.text}) 

면책 조항은 정확하지만 100 % 정확하지 않을 수 있습니다.

+0

반사가 실제로 잘 작동합니다. 단지 각 값이 조금 더 복잡하게 설정된다는 것입니다. 따라서 우리는 objectToMap.Customer.Name = sender.text와 objectToMap.Asset.Type = sender.text를 가질 수 있습니다. 기본적으로 중첩 된 속성을 가져 오거나 설정해야하므로 복잡성이 추가되었습니다. – MunkiPhD

+0

질문을하지만 규칙을 변경하면 대답을 변경해야합니다. 중첩 된 속성의 문제는 반사 BTW를 사용하여 쉽게 해결할 수 있습니다. 그러나 그것은 문제가되지 않았습니다. – chrissie1