C#의 퓨전 개체로 더 스마트한 DTO 만들기

6973 단어 dotnetcsharp
종종 우리 코드 내의 다른 엔터티에서 데이터를 전송해야 하는 경우가 있습니다. 익명(동적) 개체는 디버깅 가능성을 없애기 때문에 가장 좋은 가능성은 DTO(데이터 전송 개체)를 만드는 것입니다.

전송해야 하는 데이터의 양과 함께 DTO의 양은 항상 증가하고 실제 모델과 동기화되지 않는 환경을 만듭니다. 아마도 처리해야 할 너무 많은 클래스에 직면한 개발자의 기술적 실패 때문일 것입니다. 의.

"융합 개체"란 무엇입니까?



내 용어(모든 책, 문서 또는 외부 기사 제외)에서 "융합 개체"는 Tuple<T1, T2, T3...>에서 상속하고 Item1 및 Item2 구성원을 숨기는 개체로, 개발자가 필요한 구성원만 노출하면서 참조 엔터티.

실제 예



내 데이터베이스에 UserAuthentication(민감한 데이터를 포함하여 사용자의 인증 정보 보유) 및 UserItems(해당 사용자를 참조하는 모든 종류의 임의 항목 보유)라는 두 개의 엔터티가 있다고 가정해 보겠습니다.

class UserAutentication 
{
    public long Id { get; set; }
    public long ItemsId { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
}



class UserItems
{
    public long Id { get; set; }
    public long UserId { get; set; }
    public short ItemAQuantity { get; set; }
    public short ItemBQuantity { get; set; }
}


이제 민감하거나 쓸모없는 데이터를 노출하지 않고 최종 사용자에게 제시 가능한 방식으로 이러한 모델의 특정 필드를 가져올 수 있는 방법을 찾아야 합니다.

일반적인 방법은 다음 예와 같이 표준 DTO 모델을 만드는 것입니다.

class UserSomeActionDTO 
{
    public string Username { get; set; }
    public short ItemAQuantity { get; set; }
    public short ItemBQuantity { get; set; }
}


좋아, 대단하지, 그렇지? 그냥 싫다. 이제 UserAuthentication 템플릿 또는 UserItems 를 변경해야 한다고 가정해 보겠습니다. 또한 어려운 유지 관리 관행과 자주 발생할 수 있는 주의 문제에 따라 모든 빌드뿐만 아니라 DTO 모델을 직접 변경해야 합니다.

"융합 개체"를 사용하면 개체를 명시적으로 구성할 유형과 해당 수량(DTO를 구성할 유형이 2개, 3개 이상인 경우)을 제어하고 필요한 필드만 안전한 방식으로 노출할 수 있습니다.

class UserSomeActionDTO : Tuple<UserAuthentication, UserItems> 
{
    //Constructor will call default tuple constructor
    public UserSomeActionDTO(
        UserAuthentication item1, 
        UserItems item2
    ) : base(item1, item2) {}

    //We will overwrite "Item1" and "Item2" field to make them private
    private new readonly UserAuthentication Item1;
    private new readonly UserItems Item2;

    //Now we can expose only the needed fields to that object
    public string Username
    {
        get => Item1.Username;
    }
    public short ItemAQuantity
    {
        get => Item2.ItemAQuantity;
    }
    public short ItemBQuantity
    {
        get => Item2.ItemBQuantity;
    }
}


이제 new UserSomeActionDTO(myUserAuthentication, myUserItems)를 호출하는 이 DTO를 간단하게 인스턴스화할 수 있습니다.

좋은 웹페이지 즐겨찾기