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:

Repository-Muster mit Linq to SQL mit IoC, Dependency Injection, Unit of Work

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.

Möchten Sie vielleicht Blick auf die Active-Record-Muster; es umfasst vollständige CRUD-Operationen zusammen mit einem repository-like-query access-Fähigkeit.
Was ist mit Entity Framework ausgeliefert mit VS2010?
Ich glaube, du verpasst die Tatsache, dass er will, ORM-unabhängig.

InformationsquelleAutor |

Schreibe einen Kommentar