6

Wydaje się, że istnieje wiele przykładów na implementację wzorca Repository dla Linq do SQL. Większość z nich zawiera IRepository i DI; Niektórzy wprowadzili Jednostkę Pracy, a inni nie. Próbowałem odczytać jako większość wyników zwróconych przez wyszukiwania w SO i Google na Linq do wzorców repozytorium SQL. Mimo to nie znalazłem jeszcze kompletnego rozwiązania.Wzór repozytorium z Linq do SQL za pomocą IoC, Injection Injection, Unit of Work

Z moich odczytów I zostały wdrożone repozytorium wzór, jak pokazano poniżej:

repository pattern

używam DI zarejestrować interfejsów na których repozytoria są zależne:

this.container.RegisterType<IConnectionStringFactory, ConnectionStringFactory>(new ContainerControlledLifetimeManager(), 
    new InjectionConstructor(connectionString)); 
this.container.RegisterType<IDataContextFactory, DataContextFactory>(); 

Wdrożenie z repozytorium:

public interface IPrivilegeRepository : IRepository<PrivilegesEntity> 
{ 
    IList<MenuModel> GetRootMenu(); 
    IList<MenuModel> GetChildMenu(int parentId); 
} 

public class PrivilegeRepository : Repository<PrivilegesEntity>, IPrivilegeRepository 
{ 
    #region IPrivilegeRepository Members 

    public IList<MenuModel> GetRootMenu() 
    { 
     return FindAll(menu => menu.ParentId == null) 
      .OrderBy(menu => menu.SortOrder) 
      .Select(c => EntityMapper.Privileges.ToBusinessObject(c)) 
      .ToList(); 
    } 

    public IList<MenuModel> GetChildMenu(int parentId) 
    { 
     return FindAll(menu => menu.ParentId == parentId) 
      .OrderBy(menu => menu.SortOrder) 
      .Select(menu => EntityMapper.Privileges.ToBusinessObject(menu)) 
      .ToList(); 
    } 

    #endregion 

    public PrivilegeRepository(IDataContextFactory dataContextFactory) 
     : base(dataContextFactory) 
    { 
    } 
} 

IRepository ogólnego interfejsu:

public interface IRepository<T> where T : class 
{ 
    IEnumerable<T> All(); 
    IEnumerable<T> FindAll(Expression<Func<T, bool>> exp); 
    T Single(Expression<Func<T, bool>> exp); 
    T First(Expression<Func<T, bool>> exp); 
} 

klasy repozytorium jest realizowane poniżej w implementacjach elementu IRepository (nie pokazano), i ma zależność IDataContextFactory które DI dbanie o:

public class Repository<T> : IRepository<T> where T : class 
{ 
    public Repository(IDataContextFactory dataContextFactory) 
    { 
     this.dataContextFactory = dataContextFactory; 
    } 
} 

Składy są spożywane za pomocą IoC:

PrivilegeRepository repository = container.Resolve<PrivilegeRepository>(); 

Powracam wynik kwerendy jako kolekcja Business Object w celu uniknięcia zależności od Lin q do SQL na warstwach aplikacji, w których konsumuję repozytorium. Powyższy scenariusz działa dobrze z moją aplikacją WPF, która używa wzorca MVVM. Mam ViewModel aks Presenter klasy, które nie są zależne od klas generowanych przez Linq-SQL.

Jak rozszerzyć ten wzorzec, aby móc zapisać dane w bazie danych. Chciałbym przekazać Business Objects z powrotem do repozytorium i je zapisać. Czy to możliwe? Jak mogę wdrożyć jednostkę pracy w takim scenariuszu.

+0

Możesz chcieć spojrzeć na wzór Aktywny rekord; obejmuje pełne operacje CRUD wraz z możliwością dostępu do zapytań podobnymi do repozytorium. –

+0

Co ze strukturą Entity Framework dostarczaną z VS2010? – Raj

+0

@Raj Myślę, że przegapiłeś fakt, że chce być ORM niezależny. – Novus

Odpowiedz

1

To jest problem, który widziałem wiele razy. Chcesz oddzielić swoje obiekty biznesowe od strategii przechowywania danych. Wykonując projekcję do obiektów biznesowych, tracisz wiele ciekawych funkcji związanych z posiadaniem repozytorium (możesz zwrócić IQueryable, na przykład używając funkcji deffered execution). Jedynym sposobem, w jaki można to zaimplementować, jest na przykład uzależnienie repozytorium od zależności od IMapper<BusinessObject>. W ten sposób możesz odwzorować swój obiekt biznesowy na obiekt, którego potrzebuje repozytorium, aby zapisać coś, ale pozostawiając abstrakcję w miejscu, w którym obiekty biznesowe pozostaną nieświadome.

5

Here is an answer of mine to a similar question.

Podstawowym założeniem jest to, że rodzajowe repozytorium interfejsy nie działają tak dobrze, ale rodzajowy repozytorium implementacje dzieło wielkie. Używa LINQ do SQL jako przykładu ORM i powinien dostarczyć trochę wglądu do twojego pytania.

Pamiętaj, aby przeczytać również odpowiedź Pawła, zwłaszcza komentarze.