2010-01-26 2 views
9

Ich verwende JSON.NET zum Serialisieren und Deserialisieren von Objekten für verschiedene Zwecke. Ich bin ein großer Fan von DI, aber der Code unten gibt mir die Schüttelfrost. Gerüche wie schlechter Code:DI und 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 ... 
} 

Der Standardkonstruktor ist die Sache, die mir die Schüttelfrost gibt. Ich habe hinzugefügt, dies die Deserialisierung von JSON.NET verursacht zu unterstützen:

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

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

Hinweis der Klasse Foo inherrits von der abstrakten Basisklasse Baz!

Meine Frage an alle DI und JSON.NET Geeks da draußen: Wie kann ich Code ändern, um den Code-Geruch zu vermeiden, den der Standardkonstruktor mir in Klasse Foo gibt?

Antwort

18

Dies ist ein allgemeines Problem mit allen Arten von Data Transfer Objects, ob sie in JSON.NET, WCF oder andere Technologien passen. In der Tat könnte man sagen, dass alle Anwendung Grenze Klassen von diesem Problem zu einem Grad oder dem anderen leiden. Das Problem ist für Windows Forms Controls und andere Anzeigetechnologien gleichwertig.

Am anderen Ende des Anwendungsstacks sehen wir das gleiche Problem mit Konfigurationsobjekten und möglicherweise mit einigen ORM-Typen (z. B. Entity Framework-Klassen).

In allen Fällen ist der beste Ansatz, alle Boundary Objects als dumme Typen mit mehr Struktur als Verhalten zu behandeln. Wir wissen bereits, dass dies die richtige Lösung für WCF DataContracts, ASP.NET MVC Views, Windows Forms Controls usw. ist, so dass es eine bekannte Lösung für das Problem wäre.

Genau wie wir Controller haben, um Ansichten in einer UI zu füllen, können wir Service-Operationen, Mapper und was nicht tun, die DTOs zu Domain-Objekten zuordnen. Mit anderen Worten, Ihre beste Möglichkeit wäre, Foo nicht zu serialisieren.

Definieren Sie stattdessen eine Klasse FooJson, die die statische Struktur von Foo darstellt und einen Mapper für die Übersetzung zwischen den beiden verwendet.