Frage

Ich habe zwei verschiedene Arten gesehen, dass Programmierer nähern, wenn ein Unternehmen Kontext in ihrem Code zu schaffen.

Die erste ist, wie eine solche, und man kann es überall auf den MSDN Code-Beispiele finden:

public void DoSomething() {
     using (TaxableEducationEntities context = new TaxableEducationEntities()) {
          // business logic and whatever else
     }
}

Der zweite ist der Kontext als privates Attribut in irgendeiner Klasse zu erstellen, die Ihre Business-Logik kapselt. Also würden Sie so etwas wie:

public class Education_LINQ {

        private TaxableEducationEntities context = new TaxableEducationEntities();

        public void DoSomething() {
            var result = from a in context.luAction
                         select a;

            // business logic and whatever else
        }
}

Welcher Weg ist effizienter?

Angenommen, Sie zwei Methoden, ein genannt DoSomething1 () und andere genannt DoSomething2 () und beide Methoden übernehmen die Anweisung using den Kontext zu öffnen und zu tun, was mit ihm. Waren Sie ein Verfahren nach dem anderen zu nennen, würde jede überflüssige Aufwand geht da sein, da im wesentlichen beide Methoden den Kontext erstellen und dann bereinigen, wenn sie fertig sind? Im Gegensatz nur ein privates Attribut zu haben, die erstellt wird, wenn ein Objekt der Klasse instanziiert wird, und dann wiederum gereinigt, wenn das Objekt den Gültigkeitsbereich verlässt?

War es hilfreich?

Lösung

Erstellen einer neuen Object jedes Mal mit sich bringt ‚einige‘ Overhead. Im Wesentlichen beteiligte die Overhead-Metadaten aus einem globalen Cache in Metadaten ist das Kopieren mit dem spezifischen Object verbunden.

Dieser Aufwand relativ gering ist, so oft ist es nicht die Mühe wert, vor allem wenn Sie die zusätzliche Sicherheit, die mit der Verwendung von Mustern betrachten.

Für mich, die Option, die Sie wählen, hängt davon ab, Dinge wie:

  1. Wie lange gelebt hat, ist Ihr Verpackung Klasse wahrscheinlich zu sein? Wenn sie lebt für ein lange Zeit die Macht Object wachsen viele Einheiten zu halten Verlangsamung im Laufe der Zeit nach unten. So ein neuer Object jedes Mal könnte sein, ein gute Idee.
  2. Sind Anrufe an die Methoden auf Ihrer Verpackung Klasse synchronisiert? die Object Klasse selbst thread ist nicht so, wenn Sie verwenden das zweite Muster, das Sie benötigen um sicherzustellen, dass Ihre Verpackung Klasse / Repository ist Thread-sicher, wenn Sie erwarten mehrere Threads zu nennen.
  3. Sind die Methoden im Wesentlichen ohne Beziehung? Wenn dies der Fall kann es zu unerwarteten Nebenwirkungen, wenn sie einen Zusammenhang zwischen den Methoden teilen.

Generell meine Empfehlung ist, dass, wenn die Methoden sind staatenlos, das heißt Feuer und vergessen für jede Methode einen neuen Kontext ist wahrscheinlich eine gute Idee.

Wenn Sie jedoch eine relativ kurzlebig Stateful Form oder etwas haben, dann vielleicht ein gemeinsamer Kontext eine bessere Idee ist.

UPDATE: Ich habe die Zeit genommen, zusammen zu stellen eine vollständigere Antwort

Andere Tipps

Die zweite Option ist reinigen eigentlich nicht nach sich, wenn das ist, was du meinst. Ich ziehe die Verwendung von Object Version jedes Mal, weil ich es nach nicht entsorgen müssen. Nicht sicher, ob ich die Frage richtig obwohl bekam ... Zu viele Stunden Programmierung heute.

public class UserManagerRepository : IUserManagerRepository, IDisposable
{
    private readonly Entities _context = new Entities();
    private bool _disposed;

    public User Create(User user, int countryId)
    {
        user.Country = GetCountry(countryId);
        _context.AddToUser(user);
        _context.SaveChanges();
        return user;
    }
}

Dann dieses Repository verwenden ich so etwas wie:

using(var repository = new UserManagerRepository())
{
    repository.Create(user);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top