MAJG
1
계층형 데이터를 직렬화하기위해 클래스를 만들어야합니다.
데이터의 계층이 별로 깊지 않다면 중첩클래스를 이용하면 될거같은데 계층이 깊을 경우 보통 어떤식으로 디자인을 하나요?
아래의 XML 코드처럼 A~G 까지의 계층이 있고 이를 모두 구현해야할 때
- A~G 클래스를 같은 레벨에서 각각의 파일로 구현
- 각각의 클래스를 하나의 파일 안에 중첩 클래스로 구현
- 그밖에 다른 방법이 있을까요?
<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랑 엔티티로 분리하는걸 시도하면 좋을거 같네요. 유지보수라면 그냥 두는걸로