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:
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.
Si consiglia di osservare il pattern Active Record; copre le operazioni CRUD complete con una funzionalità di accesso alle query simile a un repository. –
E Entity Framework fornito con VS2010? – Raj
@Raj Penso che tu abbia perso il fatto che lui voglia essere ORM indipendente. – Novus