2 Stimmen

Entwurf von Dienstschicht und Repositories in Microsoft MVC

Ich habe folgendes Problem - oder besser gesagt, einen dringenden Bedarf an wertvollen Ratschlägen - mit Microsoft MVC. Eine bestimmte Aktion vom Client führt zur Erstellung von:

  • Eine Anmerkung in der Tabelle Bemerkungen
  • Ein Eintrag in der Tabelle für HourRegistrations
  • Ein Eintrag im Changelog für Tickets

Ich verwende eine Dienstschicht für Geschäftsaktionen und Repositories für CRUD-Aktionen. Das Problem ist, dass ich manchmal Objekte aus verschiedenen Datenkontexten verbinden muss, so dass ich wohl ein fehlerhaftes Design verwende. Vor kurzem haben wir damit begonnen, die gesamte Geschäftslogik aus unseren Controllern und Repositories zu entfernen, und das ist eines der ersten Probleme, auf die ich stoße.

Beispiel:

BLogic.AddRemarks(Ticket t, ...)
{
  Remark r = _remarksRepository.Create();
  r.Ticket = t;
  _remarksRepository.Add(r);
  _remarksRepository.Save();
}

Dies löst kBOOM aus, da das Ticket im Controller über das Repository abgeholt wird. Bemerkung r und Ticket t teilen also nicht denselben Datenkontext.

Ich kann die Signatur der Methode ändern und eine int TicketId angeben, aber das fühlt sich nicht richtig an. Außerdem habe ich dann im weiteren Verlauf ähnliche Probleme.

Meine Repositories werden im Konstruktor der Serviceklasse erstellt. Vielleicht muss ich sie am Anfang einer Methode erstellen? Selbst dann muss ich oft Ids anstelle der echten Objekte übertragen.

3voto

maxlego Punkte 4784

Mein Vorschlag ist die Verwendung von Dependeny Injection (oder Inversion der Kontrolle - je nachdem, wie Sie es nennen möchten). Ich selbst verwende Schloss Windor. Wirklich einfach, mit mvc.net zu integrieren. mehr lesen

Wenn IoC eingerichtet ist und läuft, erstellen Sie ContextManager. So etwas wie das hier:

public class ContextManager : IContextManager
{
    private XContext context;

    public XContext GetContext()
    {
        return context ?? (context = XContext.Create());
    }
}

Legen Sie IContextManager Lebensstil als perwebrequest und Sie bekam selbst Kontext, die Sie von Repositories und Dienste zugreifen können. und es ist das gleiche pro eine Anfrage.

EDIT

Sie müssen auch Ihre eigene controllerFactory erstellen

dann können Sie Ihre Dienste und Repositories wie folgt nutzen:

public class MyController : Controller
{
    public ISomeService SomeService { get; set; }
    public IContextManager ContextManager { get; set; }

...

}

Sie müssen keine neuen Instanzen für Dienste und Repositories erstellen und können diese Objekte in der Konfiguration verwalten. Am sinnvollsten wäre ein Singleton

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X