2012-03-27 21 views
4

Ich verwende EF4.3.1 in einer .Net4.0 Web Forms (nicht MVC!) - Anwendung.IUnitOfWork Anleitung - Best Practice

Ich neige dazu, das Repository-Muster mit einer IUnitOfWork-Schnittstelle zu verwenden. Aber ich frage mich, ob ich Best Practices befolge, zumal die meisten Beispiele, die ich befolgt habe, auf MVC-Apps basieren.

Ich werde sagen, es ist nur eine kleine Web-App, so dass die Lösung Entscheidungen beeinflussen kann.

Die Lösung hat derzeit 3 ​​Projekte, Model, Logic und Site. Model enthält die Codefirst-Entitäten und die IUnitOfWork-Schnittstelle. Logik enthält die Repositories und die Serviceebene. Seite enthält offensichtlich die Website, Codebehind, etc.

Ich verwende keine inject-Dienstprogramm von Drittanbietern (ninject, etc). Ich spritze manuell Repositories mit einem IUnitOfWork dh

öffentlichen BookingRepository (IUnitOfWork unitOfWork)

Ich bin weniger klar, was mit den Dienstschichten zu tun, sollte die IUnitOfWork auch im Site-Projekt exisit oder existiert nur in der Logik- und Modellschichten.

Derzeit spritze ich ein Repository und eine Arbeitseinheit in einen Dienst, dh

öffentlichen Reservierungsservice (IUnitOfWork unitOfWork, IBookingRepository Repository, IAppSettings appSettings)

Das bedeutet aber, die commiting (zu db speichern) erfolgt auf der Site-Ebene, aber ich frage mich, ob es in der Service-Schicht getan werden sollte. Es bedeutet auch, dass, da mein IUnitOfWork in meiner Modellschicht deklariert ist, ich auch einen Verweis auf Model in meiner Site benötige.

Was kann ich besser machen? Mache ich etwas richtig? lol

+0

IUnitOfWork sollte nicht in Repository übergeben werden, nur in Betrieb genommen. Siehe Beispiel hier http://stackoverflow.com/questions/9808577/multiple-generic-repositories-in-unitofwork/9809550#9809550 –

Antwort

3

Dmitry hat Recht. Hier ist eine Beispielimplementierung einer Arbeitseinheit. Der Vorteil hierbei ist, dass das Arbeitseinheitsmuster die Arbeit der mehreren Repositorys koordiniert, indem es eine einzige Datenbankkontextklasse erzwingt, die von allen gemeinsam genutzt wird.

Dies ist eine gute Ressource für den Anfang zu verstehen, wie diese Muster zusammen verwendet werden können. Es gilt sowohl für die MVC- als auch für die Web Forms-Entwicklung. Implementing the Repository and Unit of Work Patterns in an ASP.NET MVC Application

public class UnitOfWork : IDisposable 
{ 
    private DbContext _context; 
    private PersonRepository _personRepository; 
    private CompanyRepository _companyRepository; 

    public UnitOfWork(DbContext context) 
    { 
     this._context = context; 
    } 

    public void Commit() 
    { 
     _context.SaveChanges(); 
    } 

    // We lazy-load our repositories... 
    public PersonRepository PersonRepository 
    { 
     get 
     { 
      if (this._personRepository == null) 
      { 
       this._personRepository = new PersonRepository(context); 
      } 
      return _personRepository; 
     } 
    } 

    public CompanyRepository 
    { 
     get 
     { 
      if (this._companyRepository == null) 
      { 
       this._companyRepository = new CompanyRepository(context); 
      } 
      return _companyRepository; 
     } 
    } 

    //IDisposable implementation removed for brevity... 
}