Ist etwas nicht in Ordnung mit ein paar privaten Methoden, die IQueryableT und alle öffentlichen Methoden offenlegen, die IEnumerableT aussetzen?

9

Ich frage mich, ob es eine bessere Möglichkeit gibt, dieses Problem anzugehen. Ziel ist die Wiederverwendung von Code.

Nehmen wir an, ich habe einen Linq-To-SQL-Datenkontext und ich habe eine "Repository-Stil" -Klasse geschrieben, die viele der Methoden, die ich brauche, umschließt und IQueryables verfügbar macht. (so weit, kein Problem).

Nun, ich baue eine Service-Schicht, um auf dieses Repository zu setzen, viele der Service-Methoden werden 1 & lt; - & gt; 1 mit Repository-Methoden sein, aber einige nicht. Ich denke, ein Codebeispiel wird das besser veranschaulichen als Worte.

%Vor%

Dieser spezielle Fall ist nicht das beste Beispiel, da ich das Repository direkt in der GetActiveMyClass-Methode aufrufen könnte, aber nehmen wir an, dass mein privates IQueryable eine zusätzliche Verarbeitungs- und Geschäftslogik ausführt, die ich nicht replizieren möchte meine öffentlichen Methoden.

Ist das ein schlechter Weg, ein Problem wie dieses anzugreifen? Ich sehe es nicht so komplex, dass es wirklich eine dritte Klasse schafft, zwischen dem Repository und der Serviceklasse zu sitzen, aber ich würde gerne Ihre Gedanken sammeln.

Aus Gründen der Argumentation lassen Sie zwei zusätzliche Dinge vermuten.

  1. Dieser Dienst wird über WCF bereitgestellt und jede dieser öffentlichen IEnumerable-Methoden ruft .Select(m => m.ToViewModel()) für jede zurückgegebene Sammlung auf, die sie in ein POCO für die Serialisierung konvertiert.
  2. Der Dienst muss eventuell einige context.SomeOtherTable verfügbar machen, die nicht in das Repository eingebunden werden.
Nate 25.05.2010, 20:36
quelle

1 Antwort

5

Ich denke, es ist ein gutes Modell, da Sie grundlegende private IQueryable-Funktionen erstellen können, die von den Funktionen verwendet werden können, die Sie öffentlich zugänglich machen. Auf diese Weise müssen Ihre öffentlichen Methoden nicht viele der allgemeinen Funktionen wiederherstellen, die Ihre IQueryable-Methoden ausführen, und sie können bei Bedarf erweitert und die Ausführung aufgeschoben werden, während diese Funktionalität weiterhin öffentlich ausgeblendet wird.

Ein Beispiel, wie man X aus einer Tabelle herausholt, die eine Menge Logik braucht, die man in seiner rohen Form nicht braucht. Sie haben dies dann wie in Ihrem Beispiel als private Methode, und dann fügt die public-Methode die Finalisierungskriterien oder -abfragen hinzu, um eine verwendbare Menge von Daten zu generieren, die von Funktion zu Funktion unterschiedlich sein können. Warum erfinden Sie das Rad immer und immer wieder neu ... erstellen Sie einfach das Basisdesign (das Sie IQueryable tun) und lassen Sie das erforderliche Profilmuster fallen (Ihr öffentlicher IEnumerable tut das):)

+1 für ein gutes Design IMO.

    
Kelsey 25.05.2010, 21:13
quelle

Tags und Links