using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Diagnostics; namespace Components.Data { public abstract class RepositoryImpl<T> : IRepository<T> where T : class { public virtual void Delete(T item) { using (IDataContext db = DataContext.Instance()) { dynamic repo = db.GetRepository<T>(); repo.Delete(item); } } public virtual void Delete(string sqlCondition, params object[] args) { using (IDataContext db = DataContext.Instance()) { dynamic repo = db.GetRepository<T>(); repo.Delete(sqlCondition, args); } } public virtual IEnumerable<T> Find(string sqlCondition, params object[] args) { IEnumerable<T> list = default(IEnumerable<T>); using (IDataContext db = DataContext.Instance()) { dynamic repo = db.GetRepository<T>(); list = repo.Find(sqlCondition, args); } return list; } public virtual IPagedList<T> Find(int pageIndex, int pageSize, string sqlCondition, params object[] args) { IPagedList<T> list = default(IPagedList<T>); using (IDataContext db = DataContext.Instance()) { dynamic repo = db.GetRepository<T>(); list = repo.Find(pageIndex, pageSize, sqlCondition, args); } return list; } public virtual IEnumerable<T> Get() { IEnumerable<T> list = default(IEnumerable<T>); using (IDataContext db = DataContext.Instance()) { dynamic repo = db.GetRepository<T>(); list = repo.Get(); } return list; } public virtual IEnumerable<T> Get<TScopeType>(TScopeType scopeValue) { IEnumerable<T> list = default(IEnumerable<T>); using (IDataContext db = DataContext.Instance()) { dynamic repo = db.GetRepository<T>(); list = repo.Get<TScopeType>(scopeValue); } return list; } public virtual T GetById<TProperty>(TProperty id) { T item = default(T); using (IDataContext db = DataContext.Instance()) { dynamic repo = db.GetRepository<T>(); item = repo.GetById<TProperty>(id); } return item; } public virtual T GetById<TProperty, TScopeType>(TProperty id, TScopeType scopeValue) { T item = default(T); using (IDataContext db = DataContext.Instance()) { dynamic repo = db.GetRepository<T>(); item = repo.GetById<TProperty, TScopeType>(id, scopeValue); } return item; } public virtual IPagedList<T> GetPage(int pageIndex, int pageSize) { IPagedList<T> list = default(IPagedList<T>); using (IDataContext db = DataContext.Instance()) { dynamic repo = db.GetRepository<T>(); list = repo.GetPage(pageIndex, pageSize); } return list; } public virtual IPagedList<T> GetPage<TScopeType>(TScopeType scopeValue, int pageIndex, int pageSize) { IPagedList<T> list = default(IPagedList<T>); using (IDataContext db = DataContext.Instance()) { dynamic repo = db.GetRepository<T>(); list = repo.GetPage<TScopeType>(scopeValue, pageIndex, pageSize); } return list; } public virtual void Insert(T item) { using (IDataContext db = DataContext.Instance()) { dynamic repo = db.GetRepository<T>(); repo.Insert(item); } } public virtual void Update(T item) { using (IDataContext db = DataContext.Instance()) { dynamic repo = db.GetRepository<T>(); repo.Update(item); } } public virtual void Update(string sqlCondition, params object[] args) { using (IDataContext db = DataContext.Instance()) { dynamic repo = db.GetRepository<T>(); repo.Update(sqlCondition, args); } } } }What this class will allow you to do is create a simple class that inherits
RepositoryImpl
and gain access to all the CRUD operations.
using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Diagnostics; using DotNetNuke.Data; namespace Components.Data { public interface IAnyEntityRepository : IRepository<AnyEntityName> { } public class AnyEntityRepository : RepositoryImpl<AnyEntityName>, IAnyEntityRepository { } }Additionally this structure will allow you to use dependency injection like
Ninject
to inject the concrete class using the IAnyEntityRepository interface.
Great idea. I think there are lots of things along this line that can make DNN module development much easier and more standardized. In particular, integration with the Social API (journal, taxonomy, folksonomy, content items, search, and more. I’ve just started working on a solution (like a mix of a new base class, new simpler manifest, and an interface for creation). I’d like to incorporate your work here.