문제

우리 개발팀에서 디자인 문제가 발생했습니다.누군가가 아키텍처의 이 부분을 정리하는 데 도움을 줄 수 있기를 바랍니다.

내 시스템에는 250명의 멤버가 있는 열거형이 있습니다(한 멤버는 고유한 드롭다운을 나타냄).지정된 창의 드롭다운을 채우기 위해 해당 양식은 필요한 드롭다운과 관련된 열거형 멤버를 보내고 드롭다운 정보가 반환됩니다.

즉, 예를 들어 창이 3개 있다고 가정해 보겠습니다.창 A에는 X, Y, Z 드롭다운이 있습니다.창 B에는 드롭다운 W, X, Y가 있고 창 C에는 드롭다운 T, U, W가 있습니다.내 DropDownType 열거형은 T, U, W, X, Y, Y 및 Z로 구성됩니다.따라서 지정된 창의 경우 해당 창의 드롭다운이 주어지면 해당 드롭다운에 표시될 데이터를 쿼리합니다.

내 애플리케이션은 250개가 넘는 개별 드롭다운으로 구성되어 있으므로 이는 단순화된 예입니다.

상상할 수 있듯이 각 드롭다운에 대한 데이터를 반환하는 공장 설정이 있습니다.그리고 이 팩토리는 요청된 각 드롭다운에 대해 호출됩니다.

    switch (dropDownType)
    {
        case DropDownType.T:
            return (from t in dataContext.GetTable<TableOne>() 
                    select new DropDownDto 
                               { 
                                   DropDownDisplayName = t.ColumnA,
                                   DropDownValue = t.ColumnB
                               }).ToList();
        case DropDownType.U:
            return (from u in dataContext.GetTable<TableTwo>() 
                    select new DropDownDto 
                               { 
                                   DropDownDisplayName = u.ColumnC,
                                   DropDownValue = u.ColumnD
                               }).ToList();
        // etc...
    }

이 열거형에 멤버가 너무 많아서 이것을 코딩하는 더 우아한 방법을 아는 사람이 있습니까?이것을 팩토리 메소드로 변환하는 것이 도움이 될 것이라고 생각하십니까(그러나 그러면 소스에 있는 250개의 개별 파일에 대해 걱정해야 합니다...)?더 유용한 또 다른 패턴이 있나요?이 거대한 스위치 문을 갖는 것만으로도 관리가 어려워집니다.

어떤 도움이라도 대단히 감사하겠습니다.미리 감사드립니다!

도움이 되었습니까?

해결책

당신은 Dictionary<DropDownType, DropDownDtoDelegate> 각 항목에는 열거형 항목이 키로 포함되어 있고 드롭다운 데이터를 값으로 검색하는 대리자가 포함되어 있습니다.이렇게 하면 드롭다운 목록을 반환하는 각 메서드를 거대한 스위치 문에서 분리하여 유지할 수 있습니다.그런 다음 대리자를 검색하고 실행하고 드롭다운 목록 데이터를 반환하는 메서드가 하나 있습니다.

다른 팁

그러한 문제에 대한 몇 가지 해결책이 있습니다.

  1. 사전을 사용하여 드롭다운에서 데이터를 매핑할 수 있습니다.

  2. 이 매핑 데이터를 데이터베이스로 이동하는 것을 고려할 수도 있습니다.데이터의 양이 이러한 결정을 정당화할 수 있습니다.

  3. 열거형 형식에서 추가 키를 제거하려면 드롭다운 이름을 키로 사용하는 것을 고려하세요.

다음은 관련 문제를 다루고 유사한 솔루션을 제안하는 정말 좋은 블로그입니다.

기본으로 돌아가기 - If, For 및 Switch 이후의 삶 - 데이터 구조 알림

한 가지 옵션은 리플렉션을 사용하여 열거형 값을 처리하는 것입니다.관련된 모든 클래스에 대해 일관된 명명 표준이 있는 경우 쿼리할 테이블/컬렉션의 이름과 반환할 DTO의 이름을 동적으로 생성하는 방법이 있을 수 있습니다.작동하려면 약간의 "오버헤드" 코드가 필요하지만 일단 그렇게 하면 잠재적으로 다른 모든 테이블에서 작동할 수 있습니다.

DynamicMethod를 사용하여 런타임에 열거형의 각 항목에 대한 코드를 생성합니다.이는 사전에 캐시되고 요청 시 생성되어야 합니다.

속성을 사용하면 각 열거형에 사용되는 엔터티와 필요한 두 가지 속성을 설정할 수 있습니다.

나는 이런 것을 상상할 수 있습니다.

enum DropDownType
{
   [Configuration(Type = typeof(TableOne), DisplayNameProperty = "ColumnA", ValueProperty = "ColumnB")]
   T,

   [Configuration(Type = typeof(TableTwo), DisplayNameProperty = "ColumnC", ValueProperty = "ColumnD")]
   U
}

열거형 값이 있으면 사전에서 캐시된 메서드를 확인하고, 없으면 생성합니다.

리플렉션을 사용하면 해당 속성 정보를 얻을 수 있으며 약간의 IL 기술을 사용하면 이 작업을 쉽게 수행할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top