2010-11-22 11 views
7

Ich habe dieses Szenario in meiner Anwendung:MVC - verweist auf ein Modell aus einem anderen Modell

  • Controller1

    • .GetItems()
  • Modell1

    • .GetItems()
  • Controller2

    • .GetCurrentUser()
  • Model2

    • .CurrentUser

In diesem Szenario ruft Controller1.GetItems() die Model1.GetItems() -Methode auf. Die Model1.GetItems() -Methode muss beispielsweise wissen, welche Rolle der aktuelle Benutzer beim Erstellen der richtigen Elementliste spielt, und er sollte sie von der Model2.CurrentUser-Eigenschaft abrufen (die die zwischengespeicherte Information über den aktuellen Benutzer speichert)).

Ist es eine gute Übung, auf ein Modell von einem anderen Modell zuzugreifen?

Danke, Grüße

Antwort

3

Sie werden einige Argumente über die beste Möglichkeit, dies zu tun, aber am Ende des Tages haben Sie zwei Möglichkeiten. Entweder Sie können das Modell die Informationen holen, die es von dem anderen Modell benötigt, oder Sie können veranlassen, dass der Controller die benötigten Informationen weitergibt.

Basierend auf dem, was ich gelesen habe, solange das Modell keine Controller-Logik oder View-Logik hat, sind Sie gut, so ist nichts falsch daran, das Modell über andere Modelle zu wissen. Andere haben jedoch argumentiert, dass der Code ein wenig einfacher zu dokumentieren ist, wenn der Controller die benötigten Informationen weitergibt, da Sie sehen können, dass das Modell Informationen von woanders benötigt. Am Ende des Tages sehe ich beide als gültig und die, die Sie verwenden, wird wahrscheinlich zu persönlichen Vorlieben kommen.


Entwurf - Controller liefert Daten

ModelOne

  • Benutzer GetCurrentUser()

ModelTwo

  • Artikel [] GetItems (Benutzer)

Snippet - Regler Proivdes Daten

Controller { 
    function doWork() { 
    User user = ModelOne.GetCurrentUser(); 
    Items[] items = ModelTwo.GetItems(user); 
    } 
} 

Entwurf - Modell Ruft Daten

Mo Delone

  • Benutzer GetCurrentUser()

ModelTwo

  • Artikel [] GetItems()

Snippet - Modell Ruft Daten

ModelTwo { 
    Items[] GetItems() { 
    User user = ModelOne.GetCurrentUser(); 

    ... 

    } 
} 

Controller { 
    function doWork() { 
    Items[] items = ModelTwo.GetItems(); 
    } 
} 
+0

Danke. Daher bevorzuge ich, dass das Modell Daten vom anderen Modell erhält. Der Grund ist: Veröffentlichen der Frage auf Stackoverflow Ich habe das Szenario vereinfacht. Im realen Szenario könnte das Modell auch andere Informationen aus anderen Modellen (z. B. ein anderes Modell, das Informationen über die Benutzerloyalitätsebene des aktuellen Benutzers besitzt) auf erweiterbare Weise benötigen. Daher bevorzuge ich die Zentralisierung der Logik in Model1.GetItems(), die alle Modelle verwendet, die zum Generieren der richtigen Elementliste erforderlich sind. – Stefano

1

Ich glaube, Sie keine Verweise zwischen den Modellen, die richtige Art und Weise haben sollte, ist die Steuerung für diesen Link zu verwenden. In Ihrem Fall könnten Sie den CurrentUser als Parameter in der GetItems-Methode übergeben.

+0

Also sagen Sie, dass ich die beiden Modelle in Controller1 referenzieren sollte und dann in Controller1.GetItems() sollte ich: 1) Model2.GetCurrentUser() aufrufen und den Benutzer abrufen; 2) Rufen Sie Model1.GetItems (user) auf und übergeben Sie ihm den Benutzer. Recht? – Stefano

+0

Ja, wenn diese 2 Modelle im selben Fluss verwendet werden, denke ich, dass es sinnvoll wäre, dies in einem Controller zu tun. Oder wenn Sie Controller benötigen, die als Teil Ihres Abstraktionsmusters an Modelle gekoppelt sind, können Sie einen dritten Controller verwenden, der Referenzen auf beide Controller hat und das gleiche tut. – dain

3

Wenn Ihr zweites Modell oft von Ihrem ersten referenziert wird, könnten Sie Ihre Modellklassen in eine separate Bibliothek kompilieren?

+0

Modellklassen sind bereits in einer separaten Assembly kompiliert. Was ist das Problem dabei? Ich verstehe nicht. – Stefano

Verwandte Themen