Frage

Dies ist eine jener Situationen, in denen „Paralyse durch Analyse“ scheint Einzug gehalten zu haben, um Rat bitte!

Das Projekt

Eine ziemlich einfache Liste der Kfz-Produkte, die Details wie referenznummer umfassen, die Fahrzeuge, die sie usw. passen.

Das Frontend ist eine asp.net MVC-Anwendung.

Das Backend SQL ist, die Produkte in Domänenobjekte mit Subsonic zu projizieren.

Funktionen

Eines unserer Bildschirm ist ein Produktdetail Bildschirm. Ein ASP.NET MVC-Controller ruft das Produkt Repository Produktdetails abzurufen, gibt diese Details (über einige Automapping auf eine Ansichtsmodell) zur Ansicht.

Nun ist das Killer-Detail ist, dass wir zwei oder drei Kanäle in die Website haben, je nach Kanal, muss der Benutzer unterschiedliche Teilenummern sehen.

Hier kann zum Beispiel sagen, wenn es der Retail-Kanal ist dann die Teilenummern sind, wie sie in der Datenbank vorhanden sind, aber wenn der Benutzer auf die Website durch den Handelskanal gekommen ist, der Anfang der Teils Referenz wird mit alternativen Zahlen ersetzt.

z. wenn 0900876 über den Handelskanal betrachtet wird 1.700.876.

Wo ich bin zu kämpfen ist bei der Entscheidung, wo die „Channel Regeln“ in Bezug auf Teilereferenzen (und anderen Details, die verändern können) kapseln.

Ich habe diese Alternativen in Betracht gezogen.

Schreiben Sie die Logik direkt in das Domain-Objekt

Auf dem Produkt Klasse haben wir eine Methode / Eigenschaft haben könnte Übersetzte Teil Referenz zu erhalten.

public string TranslatedPartRef()
    {
        if (this.Channel == "Trade")
        {
            return PartRef.Replace("0900", "1700");
        }
        else
        {
            return PartRef;
        }
    }      

In diesem Szenario der Produktinstanz über den Kanal wissen muss, was mir falsch zu sein scheint.

kapselt die Logik in einem anderen Objekt

Wir könnten eine Klasse schreiben, diesen Teil Referenzübersetzung zu handhaben, oder erstellen Sie ein Kanal Klasse, die diese Logik enthält.

Was ich nicht verstehe, ist aber, wie man dann koordinieren die beiden Klassen.

Wenn der Controller das Repository ruft das Produkt abzurufen, sollte es dann herausfinden, was Kanal verwendet wurde, und das Teil Referenz übersetzen? wenn ja, wie kann ich das Produkt dann sende damit Teil Bezug zurück auf die Ansicht übersetzt wird?

Es ist auch erwähnenswert, dass dieser Teil Bezugnahme in den Suchergebnissen und anderen Szenarien als auch, ich glaube, zu zeigen, hat aus diesem Grunde muss es ordentlich irgendwo innerhalb der Domäne enthalten sein.

War es hilfreich?

Lösung

Ich bin kein C # Kerl, aber ich würde dies mit einem Decorator in Java angreifen, glaube ich.

Angenommen, Sie eine Schnittstelle für Produkt haben, dann können Sie einen Decorator erstellen, die Teilenummer Ausgabe verwaltet.

class Product implements IProduct {
    public String getProductCode();
    // etc
}

class ProductChannelDecorator implements IProduct
{
    // constructor, like this in C#?
    public ProductChannelDecorator(IProduct product, Channel channel) { 
        this.product = product;
        this.channel = channel;
    }
    public String getProductCode() {
        switch (this.channel) {
            case Channel.RETAIL:
                return this.decorated.getProductCode();
            case Channel.TRADE:
                return retailToTradeTransformer(this.product.getProductCode());
            // etc
        }
    }
    // etc
}

Andere Tipps

Die erste Frage, die Sie sich stellen müssen, ist, ob das Konzept eines Kanals ein Domänenkonzept ist oder nicht. Ihre Frage scheint darauf hinzudeuten, dass es nicht ist, aber auf der anderen Seite, ich glaube nicht, es klingt anwendungsspezifisch entweder.

Eine weitere Frage, die Sie fragen könnte, ist: , wenn in der Zukunft, ich eine andere Anwendung, die auf dieser Domain-Modell aufbauen müssen (zB einen Web-Service oder einen Rich-Client), würde ich muss noch behandeln das Konzept eines Channel?

Meine Vermutung ist, dass die Antwort sein könnte ja .

Soweit ich verstehe Ihre Frage, wird der Kanal auf den Anforderungskontext in irgendeiner Weise im Zusammenhang. Vielleicht ist es wirklich ein Attribut des Benutzers. Oder vielleicht in einem Attribut der Anwendungskonfiguration selbst.

Auf jeden Fall würde ich ernsthaft darüber nachdenken, ob es nicht wirklich ein Domain-Konzept nach allen ist. Wenn ja, dann könnte es sehr schön in einem Domain-Objekt gehört.

Wenn nicht, die Dekorateur Implementierung von ptomli vorgeschlagen klingt wie ein guter Ansatz.

Wie viele verschiedene varients Teilnummer würde da sein. Wenn es nur Handel v Einzelhandel ist würde ich sehr einfach versucht sein, haben beide Zahlen im Produktobjekt und haben die Benutzeroberfläche entscheiden, welche angezeigt werden soll. Wenn auf Produkt wirkt, kann die Identität sein „Typ {Handel, Einzelhandel} Zahl“.

Für etwas Modus flexibel Ich denke, das ist Ihre Channel-Idee ist in Ordnung. Aber wenn es eine bidirektionale Verantwortung hat, Kartierung Einzelhandel und aus dem Handel, würde dies zu funktionieren scheint. Die Channel-Objekt con als Adapter, kann andere Transformationen und Anreicherungen gesehen werden.

Als Implementierung würde ich ein separates Kanal-Objekt für jeden Kanal wird die Erstellung und versuche Case-Anweisungen, und wenn sonst sonst Logik zu vermeiden. Für Einzelhandel könnte das Channel-Objekt ein NOOP-Objekt für Handel, es teh Zuordnungen tun. Eine Fabrik kann das approporaye Channel-Objekt creat.

Was passiert, wenn die Teilenummer-Mapping ändern könnte? Im Moment ist es ein Präfix, die sich ändert, aber könnte es sein, andere Arten von Änderungen müssen Sie sorgen für? Vielleicht brauchen Sie nicht, aber:

Auf der Business-Ebene, Sie sagen, dass ein Produkt unterschiedliche Teilenummern haben kann, abhängig von Kanal (was schließlich eine grundlegende Geschäftsidee ist). So legt nahe, dass das, auf Datenbankebene es irgendwo ein Part Tisch sein könnte, das hat ProductId, KanalId und Part Spalten. Dies wird sicherlich den Fall abzudecken, in denen mehrere Kanäle im Laufe der Zeit erscheinen (heute ist es Einzelhandel oder Handel, morgen sie Web hinzufügen könnte, Mail-Order usw. von denen alle denkbar könnten unterschiedliche Teilenummern wollen).

Auf der Objektebene, diese Karten zu einer Product Instanz eine Dictionary<Channel, PartNumber>, die verwendet werden können, die entsprechende Teilenummer eines Channel gegeben zu erhalten.

  

Nun ist das Killer-Detail ist, dass wir zwei oder drei Kanäle in die Website haben, je nach Kanal, muss der Benutzer unterschiedliche Teilenummern sehen.

Eine straight forward Lösung:

public interface IChannel
    function GetNumber(Part as IPart) as String
end interface

Keine Dekorateure, keine Schalter, keine Umkehrung der Kontrolle.

Jedes Mal, müssen Sie Teilenummer für einen bestimmten Kanal dieser Methode rufen Sie an.

dim Channel as IChannel = ...
dim Part as IPart = ...
dim PartNumber = Channel.GetNumber(Part)

Jedes Mal, benötigen Sie eine andere Teilenummer Berechnungsmethode Sie einfach diese Schnittstelle implementieren.

public class TradeChannel
    implements IChannel

    public function GetNumber(Part as IPart) as String implements IChannel.GetNumber
        return Part.Number.Replace("0900", "1700")
    end function
end class
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top