Repository-Muster mit Linq to SQL mit IoC, Dependency Injection, Unit of Work
Scheint es eine Menge von Beispielen auf die Umsetzung von Repository-pattern für Linq to SQL. Die meisten von Ihnen mit IRepository und DI; Einige umgesetzt haben, ist die Einheit von Arbeiten und einige nicht. Ich habe versucht, zu Lesen, wie die meisten der zurückgegebenen Ergebnisse von Recherchen auf SO und Google auf Linq to SQL-repository-Muster. Dennoch habe ich nicht über eine komplette Lösung noch nicht.
Aus meinen Lesungen habe ich implementiert eine repository-Muster, wie unten gezeigt:
Ich bin mit DI zu registrieren, Schnittstellen, auf denen die repositories hing:
this.container.RegisterType<IConnectionStringFactory, ConnectionStringFactory>(new ContainerControlledLifetimeManager(),
new InjectionConstructor(connectionString));
this.container.RegisterType<IDataContextFactory, DataContextFactory>();
Implementierung von Repository-Muster:
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 generische Schnittstelle:
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);
}
Repository-Klasse implementiert ist, wie unten mit Implementierungen von IRepository (nicht gezeigt) und ist mit einer Abhängigkeit von IDataContextFactory die DI kümmert sich um:
public class Repository<T> : IRepository<T> where T : class
{
public Repository(IDataContextFactory dataContextFactory)
{
this.dataContextFactory = dataContextFactory;
}
}
Repositories sind verbraucht mit IoC:
PrivilegeRepository repository = container.Resolve<PrivilegeRepository>();
Ich fahre Ergebnis von Abfragen als eine Sammlung von Business-Objekt, um zu vermeiden, die Abhängigkeit von Linq to SQL-Anwendung auf Ebenen, wo ich konsumieren-repository. Das oben beschriebene Szenario funktioniert Prima mit meiner WPF-Anwendung, die mithilfe von MVVM-Muster. Ich habe ViewModel aks Presenter-Klassen, die nicht hing von Klassen erzeugt, die von Linq-SQL.
Wie verlängere ich dieses Muster, so dass ich die Daten speichern können, auf die Datenbank. Ich möchte die pass Business-Objekte zurück, um das repository und Sie gespeichert. Ist es möglich? Wie kann ich implementieren, die Einheit von Arbeit in einem solchen Szenario.
Was ist mit Entity Framework ausgeliefert mit VS2010?
Ich glaube, du verpasst die Tatsache, dass er will, ORM-unabhängig.
InformationsquelleAutor |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine Antwort von mir auf eine ähnliche Frage.
Die grundlegende Idee ist, dass generische repository Schnittstellen nicht so gut funktionieren, aber generische repository Implementierungen große Arbeit. Es verwendet LINQ to SQL am Beispiel ORM und sollte Einblick auf Ihre Frage.
Achten Sie darauf, Lesen über Paul ' s Antwort so gut, vor allem die Kommentare.
InformationsquelleAutor
Gut, das ist ein problem, das ich gesehen habe, eine Menge Zeit. Sie wollen, um die Entkopplung der business objects aus Ihren Daten-storage-Strategie. Als Ihr eine Projektion, um Ihre business-Objekte, die Sie verlieren eine Menge nette features mit einem repository (Sie zurückkehren konnten IQueryable zum Beispiel die Verwendung von latente-Ausführung). Der einzige Weg, Sie können dies umsetzen, indem man das Repository eine Abhängigkeit gegenüber einer
IMapper<BusinessObject>
zum Beispiel. Auf diese Weise können Sie ordnen Sie Ihre business-Objekt aus dem Objekt-repository braucht, um etwas lagern, sondern dass die Abstraktion im Ort, wie Sie Ihre business Objekte bleiben Persistenz unwissend.InformationsquelleAutor