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:
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.
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. –
Co ze strukturą Entity Framework dostarczaną z VS2010? – Raj
@Raj Myślę, że przegapiłeś fakt, że chce być ORM niezależny. – Novus