2011-08-22 6 views
4

나는 프로젝트의 큰 리팩터링을 집어 넣었고, 나는 들어가야 만하는 방향을 확인/이해할 것을 this question에게 물어 보았다. 나는 원했던 대답을 가지고 있다고 생각한다. 이제 코드를 리팩토링해야합니다. 저는 Martine Fowler와 Martin Feathers의 책을 읽었으며 많은 통찰력을 가지고 있습니다. 그러나 내가 원하는 응용 프로그램의 궁극적 인 목표에 대한 조언을 찾고 있습니다.실제 OOP 또는 객체가없는 동적 양식?

응용 프로그램을 조금이라도 재현하려면 필드 사이에 많은 유효성 검사 논리 및 데이터 논리가있는 동적 양식 시스템을 반복하십시오. 삽입되는 주 레코드는 페이지에있는 양식 필드 세트입니다. 그것의 또 다른 부분은 사람을 위해 할 수있는 '행동'입니다. 이러한 '액션'은 클라이언트별로 다를 수 있으며 '액션'이 수백 개 있습니다. 또한 '사람'이 다른 사람 (예 : 학생 또는 직원)이 될 수있는 유사한 분야를 결국 취할 수있는 엔진을 어떻게 든 만들 수있는 이야기가 있습니다. 그래서 나는 아주 짝이없는 것을 만들기를 원합니다. 우리는 하나의 코드베이스를 가지고 있지만, 다른 클라이언트에 대해 다른 DB를 가지고 있습니다. 페이지의 양식 필드 집합은 동적이지만 DB는 아니며 저장된 procs를 통해 특정 DB 테이블로 변환됩니다. 그래서 일반적인 필드 세트가 저장된 proc에 보내지고 저장된 proc은 필드에 무엇을 할 것인지를 결정합니다. 이 테이블은 실제로 매우 정적입니다. 즉, 실제로 동적이지 않으며 특정 구조가 있습니다.

내가 특별히 고민하고있는 것은 동적 양식 제어 페이지를 수행하는 좋은 방법을 설정하는 방법입니다. 대부분의 로직은 UI/aspx.cs 페이지의 코드에 포함될 것입니다. 왜냐하면로드가 웹 페이지로 제어되기 때문입니다. 이 작업을 수행 할 수있는 방법이 있습니까? 따라서 aspx.cs 페이지의 길이가 5000 줄이 아니므로 간소화 된 방식으로 수행됩니까? 나는 'FORM'개체를 가지고 있으며 속성 중 하나는 'FIELDS'입니다. 따라서이 객체는 비즈니스 계층과 데이터 계층에로드되지만 이제 fron 끝에서 FIELDS를 반복하고 페이지에 컨트롤을 출력해야합니다. 또한 배치를 제어 할 수있는 방법이 유용 할 것입니다.이 모델을 어떻게 가져올 지 확신 할 수 없습니다. ...

또한 다른 관점에서 볼 때 - 어떻게하면 실제로이 작업을 수행 할 수 있습니까? 객체 지향 구조? 기술적으로, 그들은 무엇이든의 모양을 창조 할 수있다. 그리고 이러한 양식 필드는 모든 객체를 나타낼 수 있습니다. 예를 들어, 오늘은 '사람'을 나타내는 일련의 양식 필드를 만들 수 있습니다. 내일에는 '가구'를 나타내는 양식 필드 세트를 만들 수 있습니다. 어떻게 이것을 사람이나 가구 물체로 번역 할 수 있습니까? (또는 시도해야합니까?) 그리고 저는 양식 필드에 대한 통제권이 없습니다. 왜냐하면 그들은 무엇이든 만들 수 있기 때문입니다. ...

어떤 생각 프로세스가 도움이 될 것입니다 - 감사합니다!

+0

모든 데이터베이스 상호 작용은 저장 프로 시저를 통해 발생합니까? SQL Server? – TheGeekYouNeed

답변

0

잘 모르겠습니다. 하지만 일반 코드 작성에 적합한 두 개의 도구 상자가 있습니다. 그것은 제네릭이며 반사입니다. 일반적으로 조합입니다.

using System.Reflection; 
(...) 
public void VisitProperties(object subject) 
{ 
    Type subjectType = subject.GetType(); 
    foreach (PropertyInfo info in subjectType.GetProperties() 
    { 
     object value = info.GetValue(subject, null); 
     Console.WriteLine("The name of the property is " + info.Name); 
     Console.WriteLine("The value is " + value.ToString()); 
    } 
} 

또한 확인할 수 있습니다 : 나는 정말 당신이해야 할 노력하고 있지만 객체의 속성을 식별하는 relfection을 사용하는 방법은 다음과 같을 수 이해 생각하지 않는다

리플렉션과 함께 오브젝트의 속성을 사용하여 토론하는 블로그의 항목입니다. 실제로 이것이 일반적인 UI를 작성하는 데 어떻게 활용 될 수 있는지 논의하고 있습니다. 정확히 원하는 것은 아니지만 최소한 동일한 원칙을 사용할 수 있습니다.

http://codepatrol.wordpress.com/2011/08/19/129/

이것은 당신이 당신의 자신의 사용자 지정 특성을 만들거나 당신의 유형을 설명하기 위해 이미 이미 .NET 프레임 워크 내에 존재 자들을 사용할 수 있다는 것을 의미한다.유효성 검사, 필드 레이블, 심지어 필드 배치에 대한 규칙을 지정하는 속성을 사용할 수 있습니다. 예를 들어, -

public class Person 
{ 
    [FieldLabel("First name")] 
    [ValidationRules(Rules.NotEmpty | Rules.OnlyCharacters)] 
    [FormColumn(1)] 
    [FormRow(1)] 
    public string FirstName{get;set;} 

    [FieldLabel("Last name")] 
    [ValidationRules(Rules.NotEmpty | Rules.OnlyCharacters)] 
    [FormColumn(2)] 
    [FormRow(1)] 
    public string LastName{get;set;} 
} 

은 그럼 당신은 이러한 특성을 식별하고 apropriate 조치를 취할 내 블로그에 설명 된 방법을 사용하십시오 적절한 행에 배치하고 올바른 레이블을주는 등의 작업을 수행합니다. 이 문제를 해결하는 방법을 제안하지는 않겠지 만 적어도 반사는 알 수없는 유형에 대한 설명 정보를 얻는 위대하고 간단한 도구입니다.

+0

흠 - 네, 문제를 올바르게 설명했는지 확신 할 수 없습니다. - 결국 목표를 향해 작성한 개체는 실제로 DB에 구성됩니다. 나는이 시간에 DB에서 정말로 그것을 꺼낼 수 없다. 그리고 DB에서, '사람'에 대한 정의가 없다. 단지 필드 목록 일 뿐이다. 그래서 나의 질문은 어떻게 변화 할 수 있는지에 관한 것이다. 이것으로 정의가 있고 아키텍처의 변경이 필요합니다. 또한 여러 클라이언트에 배포하는 문제와 개별 사용자 지정 문제가 있습니다. –

2
나는 아마도 사람이나 가구 객체 에이를 번역 할 수있는 방법

(또는 심지어하려고해야 하는가?)

내가 제대로 이해하면, 당신은 아마하려고해서는 안 응용 프로그램의 성격이 매우 동적이어서이 필드를 특정 객체로 변환하십시오. 스토어드 프로 시저가 어떤 필드의 조합을 어떤 테이블에 속하는지 파악할 수 있다면 훌륭한 것입니다.

DB 스키마를 변경할 수 있다면 나는 훨씬 더 동적 인 것을 제안 할 것입니다. 하여 저장하여 기존 시스템에 다음과 같은 데이터베이스 스키마를 변경할 수없는 경우

Object { 
    ID 
    Name 
    ... (clientID, etc.) ... 
} 

Property { 
    ID 
    ObjectID 
    Name 
    DBType (int, string, object-id, etc.) 
    FormType (textbox, checkbox, etc.) 
    [FormValidationRegex] <== optional, could be used by field controls 
    Value 
} 

, 당신은 여전히 ​​적용 할 수 있습니다 : 동적 객체의 각 유형에 대해 하나의 테이블이보다는, 나는 다음과 같은 스키마를 만들 것 절차 및 고정 테이블 : 데이터베이스에서 특정 개체로 읽을

을 수행 할 수 있습니다 각 속성을 반복하고 양식 유형을 얻고 간단한 페이지에 해당하는 일반적인 형태의 유형을 추가 :

foreach(Property p in Object.Properties) 
{ 
    switch(p.FormType) 
    { 
    case FormType.CheckBox: 
     PageForm.AddField(new CheckboxFormField(p.Name, p.Value)); 
     break; 
    case FormType.Email: 
     PageForm.AddField(new EmailFormField(p.Name, p.Value)); 
     break; 
    case FormType.etc: 
     ... 
     break; 
    } 
} 

물론, 나는 PageForm 객체뿐 아니라 CheckboxFormField 및 EmailFormField 객체가 포함됩니다. PageForm 객체는 단순히 자리 표시 자일 수 있으며 CheckboxFormField 및 EmailFormField는 UserControls 또는 ServerControls가 될 수 있습니다.

게재 위치를 제어하지 않는 것이 좋습니다. 각 필드를 하나씩 세로로 나열하면됩니다. 레이아웃이 완전히 제어 될 수있는 정적 인 형태의 경우에도 어쨌든 점점 더 대중적으로 변하고 있습니다. 대부분의 가입 양식은 예를 들어이 규칙을 따릅니다.

도움이 되었기를 바랍니다. 귀하의 질문을 잘못 이해했거나 자세한 설명을 원하면 알려주십시오.

0

동일한 상황에서 xml을 매우 유용하게 사용했습니다. 코드에서 객체 그래프를 작성하여 양식을 쉽게 표현할 수 있습니다. 이 객체 그래프는 다시 DB에서 쉽게로드/저장 될 수 있습니다.

개체 그래프를 xml &으로 바꾸면 xslt를 사용하여 표시 할 html을 생성 할 수 있습니다. differnetn 클라이언트/버전/etc에 대해이 변환을 사용자 정의 할 수 있습니다. 나는 성능을 위해 데이터베이스에 xml을 저장한다. & 나에게 퍼블리시 기능을 제공한다.

원시 요청 게시물에 액세스 할 때 들어오는 데이터를 처리하려면 특정 코드가 필요합니다. 들어오는 데이터의 유효성을 확인해야합니다. 그러면 사람들이 양식을 속일 수 있습니다.

나는 모두 의미가 있기를 바랍니다.