계층형 데이터를 직렬화하기 위한 클래스 디자인 질문

계층형 데이터를 직렬화하기위해 클래스를 만들어야합니다.
데이터의 계층이 별로 깊지 않다면 중첩클래스를 이용하면 될거같은데 계층이 깊을 경우 보통 어떤식으로 디자인을 하나요?

아래의 XML 코드처럼 A~G 까지의 계층이 있고 이를 모두 구현해야할 때

  1. A~G 클래스를 같은 레벨에서 각각의 파일로 구현
  2. 각각의 클래스를 하나의 파일 안에 중첩 클래스로 구현
  3. 그밖에 다른 방법이 있을까요?
  <A>
    <B>
      <C>
        <D>
          <E>
            <F>
              <G1></G1>
              <G2></G2>
              <G3></G3>
              <G4></G4>
            </F>
          </E>
        </D>
      </C>
    </B>
  </A>

내용이 짧으면 a부터 g까지 한 파일에.
쫌 길면 폴더 만들고 그 안에 별도 파일로 만듭니다.

public record A
{
    public BContext B { get; init; }
    public record BContext
    {
         public string C { get; init; }
    }

}

데이터가 복잡할수록 불변으로 다루면 유리해요.
뎁스가 깊은 경우 생성이 복잡할 가능성이 높지요.
생성은 빌더 패턴 형태로

public class ABuilder
{
    public A Bulid => new A 
    { 
        B = new()
        {
               C = PropertyMakeForB
        }
    }
    public string PropertyMakeForB {get; set;}
}

근데 뎊스가 깊으므로 생성에 필요한 속성을 얻는 시점도 다를거 같군요. 의존성 주입(MSDI)으로

var builder = Host.Create...(); // 일반호스트 혹은 웹호스트
builder.Service.AddScope<ABuilder>();
builder.Service.AddTransient(sp => sp.GetRequiredSerivce<ABuilder>().Build());

사용은 scope 생성 후 scope가 유지되는 동안 A생성에 필요한 요소들을 하나둘 담아 둡니다.

scope.Services.GetRequiredService<ABuilder>.PropertyMakeForB = "안녕";

scope가 끝나기 전에 A를 생성

var a = scope.Services.GetRequiredServicw<A>();

보통 asp.net core 웹서비스는 scope를 직접 만들지 않고 httpContext.RequestServices를 쓰지요.

뎊스가 깊다는 거 부터가 뭔가 이상한 상황이라서 설계 단계라면 VO랑 엔티티로 분리하는걸 시도하면 좋을거 같네요. 유지보수라면 그냥 두는걸로