2015-09-02 11 views
7

So ist die Grundidee war:Ist es möglich, Erweiterungsoperatoren in C# zu erstellen?

Wir haben einige Geschäftsmodell

public class Model 
{ 
    public int Foo { get; set; } 
} 

Und es ist Darstellung Ansicht Modell

public class ViewModel 
{ 
    public string Foo { get; set; } 

    public static explicit operator ViewModel(Model b) 
    { 
     // Map instances using AutoMapper or whatever 
     return new ViewModel { Foo = b.Foo.ToString() }; 
    } 
} 

Unser Urinstinkt ist Modell abzubilden-Modell anzuzeigen. Wie man sehen kann ich will Mapping durchführen mit explicit operator so konnte ich

var model = new Model { Foo = 42 }; // Get model 
var viewModel = (ViewModel)model; // Map to view model 

tun und deshalb so sauber wie möglich mein Controller-Code haben ... ABER Ich möchte View-Modell und Abbildungslogik bleiben getrennt werden. Wie kann ich explicit operator Implementierung in eine externe Klasse verschieben? Ähnlich Erweiterungsmethoden:

public static class Extensions 
{ 
    public static explicit operator ViewModel(Model b) 
    { 
     // Map instances using Automapper or whatever 
     return new ViewModel { Foo = b.Foo.ToString() }; 
    } 
} 

Dieser Code ist offensichtlich, nicht aus zwei Gründen Kompilieren:
- Statische Klassen keine benutzerdefinierten Operatoren
enthalten kann - entweder Parameter oder Rückgabetyp-Erweiterungen sein muss

auch als Option könnte ich view-Modell Teil und Split-Modell selbst und Betreiber zu trennen CS- Dateien machen, aber es wäre nicht den Fall machen. Architektonisch wären sie immer noch dieselbe Klasse im selben Namensraum. Ich möchte in der Lage sein, Mapping-Logik zum Beispiel in einem anderen Projekt in Lösung zu implementieren.

Ich möchte nur ähnlich wie Erweiterungsmethoden Wirkung erzielen. Wie kann ich das machen?

+2

Eine Idee, die in den Sinn kommt, ist: Machen Sie Ihr ViewModel zu einer partiellen Klasse und Sie haben separate Dateien für das Mapping und das Modell selbst. – BitTickler

+0

Ich bin zu 99.99% sicher, dass das mit Erweiterungsmethoden nicht möglich ist. Sie können eine partielle Klasse erstellen und einen normalen überladenen Operator haben, wenn Sie nur die Logik trennen möchten. – Rob

+1

Das wäre schrecklich mit zu programmieren. Können Sie sich vorstellen, ob sich das Verhalten des Additionsoperators geändert hat, abhängig davon, auf welche Namespaces Sie verweisen? Hässlich! – Gusdor

Antwort

5

Es gibt nichts Besseres als nur:

public class ModelToViewModelMapper 
{ 
    public ViewModel Map(Model b) 
    { 
     return new ViewModel { Foo = b.Foo.ToString() }; 
    } 
} 

Erweiterungsmethoden können die gleiche Arbeit tun, aber was ist, wenn Sie die Abbildungslogik ändern möchten. Es wird einfach sein, wenn Sie dependency injection und nicht-statische Klassen verwenden

+1

Wenn man sich vorstellt, dass das Modell 200 statt 1 Eigenschaften hat, sieht das nicht mehr attraktiv aus, oder? – BitTickler

+0

@BitTickler Ich sehe keine Alternativen. Sie können Flexibilität opfern und einen gemeinsamen Mechanismus für jede Eigenschaft erfinden, aber Fälle, in denen es sich lohnt, dies zu tun, sind zu spezifisch. – astef

+0

Ja, das ist nett, danke, dass Sie versuchen, zu helfen, deshalb gebe ich Ihnen +1, aber, wie ich bereits zu BitTickler gesagt habe - das Problem liegt hier nicht im Mapping-Prozess selbst, sondern in der Möglichkeit, Mapping-Logik außerhalb von 'ViewModel zu platzieren 'Klasse, aber innerhalb 'expliziter Operator'. Je mehr ich es sage, desto unmöglicher klingt es. – Dmytro

2

Warum nicht es so machen MS tut es im System.Linq Namensraum; Es gibt Tonnen von Typumwandlungen, die durch Erweiterungsmethoden durchgeführt werden (Sie können es nicht mit Operatoren tun, C# unterstützt keine Erweiterungsoperatoren).

Definieren Sie die folgenden Erweiterungsmethode:

public static class Extensions 
{  
    public static ViewModel ToViewModel(this Model model) {...} 
} 

Ich denke, der Code bleibt sauber genug, die hier Ihr primäres Ziel zu sein scheint.

Verwandte Themen