2010-12-07 14 views
4

Ich fing an, eine kleine Anwendung zu entwerfen und einige Architektur-bezogene Fragen zu haben.C# Design-Frage

Ich habe einige grundlegende Einheiten, die ich bereit bin zu modellieren - Repository und Indicator.

Repository ist im Grunde eine Fassade der Repository Pattern verwenden, das/Speicher-beliebige Einheiten abzurufen die Lage ist, eine Datenbank Halter mit (jetzt ist es NHibernate -driven, aber ich denke, das ist nicht wirklich wichtig).

Die Indicator kann der logische Kern meiner Anwendung genannt werden. Es wird verwendet, um abstrakte Werte und die genaue Zeit zu kombinieren, zu der dieser Wert erreicht wurde (so bildet es und arbeitet an Value - Time Paaren).

Ich bin bereit, diese Indicator so allgemein wie möglich zu machen, noch glaube ich meine aktuelle Lösung ist ein großer scheitern :)

Siehe folgende Stücke von Code:

public interface IIndicator<T> 
{ 
    IEnumerable<T> RetrieveValues(DateTime start, DateTime end); 
} 

// Should also have something like indicator wrapper/proxy stub here - anything 
// that represents the 'IIndicator' interface acts through that proxy and 
// caches the evaluated data using it. 

Dies ist ein grundlegender Versuch, den Indikator zu implementieren (im Moment kann dies tatsächlich als Schein betrachtet werden):


jetzt - könnte dies gut aussehen, aber ich bin absolut sicher, dass die verwendete TimestampProxy wirklich böse ist.

Es macht auch die Dinge hart zu verstehen (zum Beispiel Methodensignatur IEnumerable<TimestampProxy> RetrieveValues(...) wahrscheinlich in einem führen würde „wtf ?!“ Phrase von einer Person, die den Code untersucht).

Leider kann ich nicht mit einer bessere Lösung/global Redesign kommen - können Sie mir raten, wie es zu tun oder einfach nur ein paar Ideen darüber erzählen, wie diese Art der Funktion sollte getan werden?

Danke.

Antwort

1

Wie refactoring die RetrieveValues-Methode zurück in das Repository selbst und geht mit einer viel einfacheren Indikator-Klasse, die im Grunde ersetzt Ihre TimestampProxy-Klasse.

Eine Sache, die mich stört ist, dass Sie die Verbindung zur DB-Tabelle verloren haben, wenn Sie es generisch machen. Es ist möglicherweise besser, einfach eine Schnittstelle zu definieren, die alle Ihre spezifischen DB-Objekte implementieren und partielle Implementierungen verwenden, um den tatsächlichen "Wert" auf die Value-Eigenschaft zu mappen.

public interface Indicator<T> 
{ 
    DateTime Timestamp { get; } 
    T Value { get; } 
} 

public partial class TemperatureIndicator : Indicator<double> 
{ 
    public double Value { get { return this.Temperature; } } 
} 

Jetzt haben Ihre Repository Methoden implementieren, die Objekte jeder Art Rückkehr - die als (in .NET 4 oder gegossen in niedrigeren Versionen) Objekte des Interface-Typ für gemeinsame Operationen verwendet werden können.