6

Sembra che ci siano molti esempi sull'implementazione del modello di repository per Linq to SQL. Molti di questi sono dotati di IRepository e DI; Alcuni hanno implementato l'Unità di lavoro e altri no. Ho provato a leggere la maggior parte dei risultati restituiti dalle ricerche su SO e Google su Linq ai modelli di repository SQL. Tuttavia non ho ancora trovato una soluzione completa.Schema del repository con Linq su SQL utilizzando IoC, Iniezione delle dipendenze, Unità di lavoro

Dalle mie letture ho implementato un modello di repository come illustrato di seguito:

repository pattern

sto usando DI registrare le interfacce su cui sono dipendevano i repository:

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

Attuazione del modello di deposito:

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 interfaccia generica:

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); 
} 

classe Repository è implementata come sotto con implementazioni di IRepository (non mostrato) e sta avendo una dipendenza IDataContextFactory cui DI si prende cura di:

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

repository vengono consumati using IoC:

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

Sto restituendo il risultato di query come una raccolta di Business Object per evitare la dipendenza da Lin q a SQL su livelli applicativi in ​​cui consumo repository. Lo scenario sopra funziona perfettamente con la mia applicazione WPF che utilizza il pattern MVVM. Ho le classi ViewModel aks Presenter che non dipendono dalle classi generate da Linq-SQL.

Come estendere questo modello in modo che possa salvare i dati nel database. Vorrei passare di nuovo Business Objects al repository e salvarli. È possibile? Come posso implementare l'Unità di lavoro in questo scenario.

+0

Si consiglia di osservare il pattern Active Record; copre le operazioni CRUD complete con una funzionalità di accesso alle query simile a un repository. –

+0

E Entity Framework fornito con VS2010? – Raj

+0

@Raj Penso che tu abbia perso il fatto che lui voglia essere ORM indipendente. – Novus

risposta

1

Bene, questo è un problema che ho visto molte volte. Desiderate avere il disaccoppiamento dei vostri oggetti di business dalla vostra strategia di archiviazione dei dati. Mentre stai facendo una proiezione ai tuoi oggetti di business perdi molte delle belle funzionalità di avere un repository (potresti restituire IQueryable ad esempio facendo uso di un'esecuzione deffered). L'unico modo per implementare questo è dare al tuo repository una dipendenza verso un IMapper<BusinessObject> per esempio. In questo modo puoi mappare il tuo oggetto di business all'oggetto di cui il tuo repository ha bisogno per archiviare qualcosa ma lasciare l'astrazione sul posto mentre i tuoi oggetti di business rimangono ignoranti alla persistenza.

5

Here is an answer of mine to a similar question.

L'idea di base è che i generici repository interfacce non funzionano così bene, ma repository generico implementazioni grande lavoro. Utilizza LINQ to SQL come l'ORM di esempio e dovrebbe fornire alcuni spunti alla tua domanda.

Assicuratevi di leggere anche la risposta di Paolo, specialmente i commenti.

Problemi correlati