2010-01-26 2 views
9

저는 JSON.NET을 사용하여 객체를 다른 목적으로 직렬화 및 비 직렬화합니다. 나는 DI의 열렬한 팬이다. 그러나 아래의 코드는 나에게 오한을 준다. 냄새는 나쁜 코드와 같습니다 :DI 및 JSON.NET

public class Foo : Baz 
{ 
    private readonly IBar bar; 

    public Foo() 
     : this(ObjectFactory.GetInstance<IBar>()) 
    { } 

    public Foo(IBar bar) 
    { 
     if (bar == null) 
      throw new ArgumentNullException("bar"); 

     this.bar = bar; 
    } 

    ... rest of class ... 
} 

기본 생성자는 오한을주는 것입니다. 나는이 JSON.NET에 의한 직렬화를 지원하기 위해 추가했습니다

string jsonString = ...; 
string concreteBazType = ...; 

Baz baz = (Baz)JsonConvert.DeserializeObject(jsonString, Type.GetType(concreteBazType); 

공지 클래스 푸 inherrits를 추상 기본 클래스 바즈에서!

내 모든 질문 DI 및 JSON.NET 괴짜 : 기본 생성자가 Foo 클래스에서 제공하는 코드 스 냄새를 피하기 위해 코드로 어떻게 변경할 수 있습니까?

답변

18

이것은 JSON.NET, WCF 또는 다른 기술에 맞는지 여부에 관계없이 모든 종류의 Data Transfer Objects에 공통적 인 문제입니다. 실제로 응용 프로그램 경계면 클래스가이 문제를 어느 정도 겪고 있다고 말할 수 있습니다. 이 문제는 Windows Forms 컨트롤 및 다른 디스플레이 기술과 동일합니다.

응용 프로그램 스택의 다른 쪽 끝에는 Configuration 개체와 잠재적으로 일부 ORM 형식 (Entity Framework 클래스 등)에서 동일한 문제가 발생합니다.

모든 경우에 가장 좋은 방법은 이러한 모든 것을 경계 개체을 행동보다 구조가 더 많은 벙어리 유형으로 취급하는 것입니다. 우리는 이것이 WCF DataContracts, ASP.NET MVC Views, Windows Forms 컨트롤 등에서 할 일이 옳다는 것을 이미 알고 있습니다. 따라서이 문제에 대한 잘 알려진 해결책이 될 것입니다.

UI에서 컨트롤러를 뷰에 채우는 것처럼 DTO를 도메인 객체에 매핑하는 서비스 작업, 매퍼 및 기타 등등을 사용할 수 있습니다. 다른 말로하면, Foo를 직렬화하려고 시도하지 않는 것이 가장 좋습니다.

대신 Foo의 정적 구조를 나타내는 FooJson 클래스를 정의하고 Mapper를 사용하여이 둘 사이를 변환하십시오.