Lassen Sie uns annehmen, dass ich eine POCO Klasse, die foos
und bars
enthält:POCOs und Utility-Methoden
public class Poco {
public IEnumerable<Foo> Foos { get { return foos; } }
public IEnumerable<Bar> Bars { get { return bars; } }
private List<Foo> foos;
private List<Bar> bars;
}
In meinem Beispiel ich muss in der Lage sein foos
und bars
hinzuzufügen und zu entfernen:
public class Poco {
public IList<Foo> Foos { get { return foos; } }
public IList<Bar> Bars { get { return bars; } }
private List<Foo> foos;
private List<Bar> bars;
}
Aber nehmen wir an, dass ich auch die (willkürliche) Einschränkung, dass es eine foo
pro bar
und auch eine bar
pro foo
geben muss.
public class NotAPocoAnyMore {
public IEnumerable<Foo> Foos { get { return foos; } }
public IEnumerable<Bar> Bars { get { return bars; } }
private List<Foo> foos;
private List<Bar> bars;
public void Add(Foo f, Bar b) {...}
public void Remove(Foo f, Bar b) {...}
}
Meine Frage ist: Soll ich immer zu versuchen, eine POCO einfach zu halten und es nicht geben keine Hilfsmethoden aufgearbeitet? Das erste Beispiel POCO ist schön, weil es unveränderlich ist, und POCOs haben andere Vorteile. Ich kann jedoch keinen Weg sehen, die Klasse zu einem POCO zu machen und trotzdem Möglichkeiten zu haben, kontrolliert auf den Inhalt zuzugreifen und ihn zu modifizieren (zumindest nicht so, wie es scheint, als würde er übertöten). Einig
dachte, dass ich gehabt haben:
Nested modifizierende Klasse
public class Poco {
public IEnumerable<Foo> Foos { get { return foos; } }
public IEnumerable<Bar> Bars { get { return bars; } }
public PocoModifier Modifier { get { ... } }
private List<Foo> foos;
private List<Bar> bars;
public class PocoModifier {
private readonly Poco toModify;
public void Add(Foo f, Bar b) {...}
public void Remove(Foo f, Bar b) {...}
...
}
}
öffentliche verschachtelte Klasse? Nein Danke! Es ist auch genau so wie die Nicht-POCO-Klasse nur mit ein wenig mehr Verschachtelung.
Mit Zugriffsmodifikatoren
public class Poco {
public IEnumerable<Foo> Foos { get { return foos; } }
public IEnumerable<Bar> Bars { get { return bars; } }
public PocoModifier Modifier { get { ... } }
internal List<Foo> foos;
internal List<Bar> bars;
}
public class PocoModifier {
private readonly Poco toModify;
public void Add(Foo f, Bar b) {...}
public void Remove(Foo f, Bar b) {...}
...
}
Etwas besser, aber erfordert eine ganze Einheit des Einsatzes für jede POCO.
Persönlich habe ich nichts dagegen, Dienstprogramm-Methoden auf Ihrem POCOs (auch wenn sie nicht wirklich POCOs mehr sind). Eine andere Option besteht darin, eine separate Erweiterungsmethodenbibliothek oder einen statischen PocoModifier zu erstellen, der sich außerhalb Ihrer POCOs befindet (Sie verschachteln also keine Klassen), aber die Machbarkeit hängt davon ab, ob Sie Ihren POCO einem Client aussetzen. – NWard
Für mich scheint es, als ob Sie Geschäftslogik in Ihre Entitäten ziehen. Schreiben Sie die Geschäftslogik in eine separate Schicht. –
Fühlt sich so an, als hätten Sie willkürliche Einschränkungen, die Sie persönlich auf Ihren Code anwenden wollten ... Vielleicht, wenn Sie darüber nachdenken, warum Sie es tun, können Sie es selbst entscheiden ... Randbemerkung: Ihr erstes Objekt ist nicht wirklich unveränderlich - Sie legen Listen offen, mit denen Sie beginnen möchten (erfordert Cast, aber wer wird dadurch gestoppt) und keine anderen Methoden anzeigen ... –