Dapper를 사용하여 추가 동적 속성이있는 강력한 형식의 모델로 바인딩

c# dapper dynamic strong-typing

문제

우리는 Dapper 를 사용하여 비즈니스 모델에 객체 관계 매핑을 제공하기 위해 이동하고 있습니다.

이러한 데이터 모델과 함께 사용자가 생성하고 반환 된 결과 집합의 일부로 나타나는 사용자 정의 필드 (런타임에는 알 수 없음)가 종종 발생합니다.

Id
Title
c_MyCustomField1
c_MyCustomField2

현재이 모든 필드는 판독기로 반환 및 처리됩니다. 이 모든 것을 Dapper 로 옮기고 있지만 동적 사용자 정의 필드와 혼합 된 강력한 형식의 객체를 혼합하는 방법을 고민하고 있습니다.

우리는 다음과 같은 옵션을 볼 수 있습니다.

  1. Dapper의 모든 결과를 동적으로 가져오고 자체 바인딩을 수행하십시오.
  2. Dapper를 사용하여 강력한 형식의 모델에 바인딩하고 별도의 호출을 만들어 사용자 지정 필드를 연결합니다.
  3. 중간에 들어가기 위해 Dapper를 확장하면 특정 사용자 사례를 추가하여 알려진 필드와 동적 필드를 모두 바인딩 할 수 있습니다.

1 은 비생산적인 것처럼 보입니다. 우리는 Dapper를 처음 소개하는 이유 중 하나 인 성능 문제를 해결할 것입니다. 2 이것은 데이터 공급자에게 엄청난 변화가 필요하기 때문에 실제로 할 수 없습니다. 3 나는 Dapper의 출처에 속하지 않는다는 것을 알고있다.

나는 성배가 다음과 같은 모델로 끝날 것이라고 생각한다.

class Model
{
    int Id {get; set;}
    string Title {get; set;}
    IList<CustomField> CustomFields {get; set;}
}

class CustomField : dynamic
{
    string Name {get; set;}
    object Value {get; set;}
}

Dapper를 사용하여이 작업을 수행 할 수있는 방법이 있습니까?

언제나 그렇듯 모든 제안은 크게 감사드립니다.

수락 된 답변

그것은 현재 dapper에서 완전히 모델링 될 수 없습니다. 비 제네릭 API를 사용하여 무언가를 수행 한 다음 바인딩을 수동으로 적용 할 수 있습니다. 아니면 그냥 동적 포장 :

class Model {
    private dynamic obj;
    public int Id { get { return obj.Id; } set { obj.Id = value; } }
    public string Title { get { return obj.Title; } set { obj.Title = value; } }

    public object this[string key] {
        get { return ((IDictionary<string,object>)obj)[key]; }
        set { ((IDictionary<string,object>)obj)[key] = value; }
    }
}

일반 매개 변수를 지정하지 않고 Query 를 사용하여 dynamic / IDictionary<string,object> 를 가져올 수 있습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.