2013-07-22 2 views
7

Ich würde gerne wissen, was der beste Ansatz zwischen der Verwendung von Anweisung und dem Erstellen einer öffentlichen Variablen ist. Mein Beispiel ist das folgende: Ich habe eine Manager-Klasse, die von Disposable erbt, und diese Klasse hat Zugriff auf meine dbcontext und Methoden dazu. Was ich jetzt mache, ist auf meiner cs-Klasse, die einen Kurs zu dieser Klasse macht und mein Objekt für meine Bedürfnisse erstellt und zerstört. Zum Beispiel:Der beste Ansatz zwischen Using und öffentlichen Objekt?

public class StudentManager: IDisposable 
{ 
    private ISchoolUnitOfWork _unitOfWork; 

    public StudentManager() 
    { 
     _unitOfWork = new SchoolUnitOfWork(); 
    } 

    public IEnumerable<Student> GetStudents() 
} 

Auf meinem cs-Klasse-I tun:

private IEnumerable<Stundets> GetStudents() 
{ 
    using (StudentManager manager = new StudentManager()) 
    { 
     return = manager.GetStudents(); 
    } 
} 

ODER

private StudentManager = new Studentmanager(); 

Was ist der beste Weg, es zu tun: die Instanz von meinem StudentManager mit (nur eine Verbindung erstellen und zerstören, wenn Seite verlassen) oder mit der using arbeiten?

Ich bin ein bisschen verwirrt darüber. Danke im Voraus!

Ich aktualisiere meinen Kontext auf dem gleichen Manager Aufruf der Speichern in meinem Kontext, der eine Schnittstelle von meiner Arbeitseinheit ist, ich nicht direkt auf den Kontext zugreifen, aber wenn ich es konstruiere ich einen Typ meine Einheit von Arbeit.

Ich speichere meine Crud-Operationen auf dem Manager. Also auf meinem Manager auf Aktualisieren, Einfügen, Ändern ich die Methode speichern aufrufen, zum Beispiel:

public class StudentManager.... 

     public Student UpdateStudent(Student student) 
     { 
      IStudentService service = new StudentService(_unitOfWork.StudentRepository); 
      Student student= service.Update(student); 
      _unitOfWork.Save(); 
      return student; 
     } 

Im Allgemeinen habe ich eine Schnittstelle IUnitOfWork und ein UnitOfWork, auch eine IRepository haben und ein Repository. Und ich benutze nur einen Manager, um meine UnitOfWork nicht direkt zu instantiieren, sondern mit einem Manager ... Ich denke, das ist legal und nützlich!

+4

Randnotiz, Ihr Unternehmen Klassen sollten die Repositories nicht besitzen und IDisposable nicht benötigen. Aber das verschiebt nur dein Problem mit der Verbindung. –

+0

Es ist nichts falsch daran, den Kontext in einem privaten Feld zu belassen und ihn innerhalb der Dispose() - Methode der Klasse, die ihn erstellt, IMO, zu ordnen. Das Verwenden von Blöcken ist eine Verknüpfung zum try/catch/finally-Muster, das sicherstellt, dass Wegwerfobjekte entfernt werden, wenn Sie damit fertig sind - aber dies ist nur ein einziges Muster *, um sicherzustellen, dass Objekte rechtzeitig entsorgt werden. Das Vorhandensein dieser Verknüpfung macht nicht automatisch alle anderen Muster unbrauchbar. –

Antwort

1

Der beste Weg ist die using Anweisung, weil es Dispose automatisch aufruft. Sie können garantieren, dass Ihre Entsorgungslogik auftritt. Dies ist in der Tat, wie Sie Objekte wie SqlConnection und SqlCommand auch verwenden sollten. Also machst du es richtig mit der using.

In der Tat haben Sie angegeben, dass Sie eine DbContext verwenden, um auf die Daten zuzugreifen. Diese sollten auf Anfrage instanziiert werden und auch in einem using gewickelt werden. Es ist nicht erforderlich, eine Instanz dieser Klassenarten zu teilen, da das Verbindungs-Pooling beim SQL Server über die Verbindungszeichenfolge erfolgt.

+0

Aber das könnte zum Erstellen mehrerer Kopien führen. –

+0

@HenkHolterman, ähnlich wie Sie jedes Mal eine neue 'SqlConnection' erstellen würden, wenn Sie sie verwenden möchten. –

+0

Nein, nicht das Gleiche. Verbindungen werden zusammengefasst. Kontexte würden jedes Mal ihren Änderungsnachverfolgungscache verlieren. –

0

Wenn Sie verwenden, dann möglicherweise in einer einzigen sein, müssen Sie ähnliche Stoffe mehr als einmal schreiben. Zum Beispiel

//To get all students 
private IEnumerable<Stundets> GetStudents() 
{ 
using (StudentManager manager = new StudentManager()) 
{ 
    return = manager.GetStudents(); 
} 
} 

//To save Students 
//To get all students 
private IEnumerable<Stundets> SaveStudents() 
{ 
using (StudentManager manager = new StudentManager()) 
{ 
    return = manager.Save(); 
} 
} 

und so weiter. Aber hier müssen Sie sich nicht um die Entsorgung des Objekts kümmern. Es wird automatisch darauf geachtet. Wenn Sie sich für die globale Deklaration entscheiden, müssen Sie dies manuell tun. Also, was ich brauche, zu sagen, wenn Sie die StudentManager der ganzen Seite nutzen zu können, warum nicht Sie es global machen und alles über die erforderlichen Stellen verwenden, mit both.Something wie diese

private StudentManager manager; 

//To get all students 
private IEnumerable<Stundets> GetStudents() 
{ 
using (manager = new StudentManager()) 
{ 
    return = manager.GetStudents(); 
} 
} 

//To save Students 
//To get all students 
private IEnumerable<Stundets> SaveStudents() 
{ 
using (manager = new StudentManager()) 
{ 
    return = manager.Save(); 
} 
} 
+0

Wenn ich das mache, wenn ich eine ussing mache, wird es automatisch schließen, oder? Ich benutze einfach einen Manager, um die cs-Klasse nicht zu laden und nur meinen dbcontext aufzurufen, wenn ich es brauche ... – user2528557

Verwandte Themen