GUI to Business mapeamento objeto VB.Net
-
06-07-2019 - |
Pergunta
O problema que estou tendo atualmente é mapear vários campos GUI para propriedades de objeto (i Apresentação camada de mapeamento de camada de lógica de negócios). Para ser mais específico, isto é, em WinForms VB.Net 2.0.
A natureza da solução obriga-nos a ter 4 colunas que exibem o mesmo tipo de comportamento em nosso GUI - cada coluna consistindo em 11 caixas de texto (que vamos usar este pequeno tamanho da amostra, como o problema se estende para além 11 caixas de texto) .
O que eu estou fazendo atualmente está definindo a tag de cada caixa de texto em todas as quatro colunas para um valor assim:
Textbox1.tag = "name"
Textbox2.tag = "type"
Textbox3.tag = "speed"
Quando um evento é gerado pela caixa de texto (por exemplo keypress), eu olhar para o recipiente pai, cuja tag Eu também definido como uma string mapeamento de um objeto específico. Eu uso que, em conjunto com a tag da caixa de texto, para determinar qual objeto de propriedade Eu preciso definir. No geral, é algo como isto:
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
Como você pode ver isso pode ficar muito ruim, muito rapidamente. Atualmente estamos assentados 43 algumas propriedades estranhas que podem ser mapeados para - assim que select é extremamente longa - muitos dos quais são incorporados em vários métodos para tentar e DRY tentativa (eu aguado o código para, essencialmente, um conceitual implementação).
A pergunta é: como posso refatorar isso? Eu tenho tentado usar um dicionários / hashes até certo ponto, mas quer se tornou excessivamente complexa, ou simplesmente não fazer uma sensação de implementação como complicado o problema ainda mais.
Obrigado pela ajuda.
Solução
O primeiro problema que você Sol, definindo a tag como o objeto. Desde tag não é uma string, mas de tipo de objeto.
E o segundo problema a resolver pelo usin reflexão, mas que o valor do tag deve corresponder ao propertyname exatamente.
_objectToMapTo.GetType().InvokeMember(sender.tag,BindingFlags.Instance Or BindingFlags.Public,Nothing, _objectToMapTo, New Object() {sender.text})
Disclaimer o reflexo está perto, mas talvez não 100% correto.