我决定实施 GenericRepository 。我意识到有“最佳实践”和许多方法可以做到这一点。我也知道会推荐IOC容器,甚至可能是一个工作单元。
但是,不要被告知“你做错了”
我的GenericRepository可能与dbcontext紧密耦合,不确定。 我正在使用反向poco生成器,但后来我添加了Generic Repository。
以下是我的代码“工作”的四种方式
1。新的
这显然是GenericRepository的新闻,但除非我只使用“AcademicLevel”的模型实体,否则在HomeController中似乎这不是一个好主意,对吧?
var repository = new GenericRepository<AcademicLevel>();
List<AcademicLevel> academic = repository.SelectAll().ToList();
2。使用声明
using (var gr = new GenericRepository<AcademicLevel>())
{
List<AcademicLevel> academic = gr.SelectAll().ToList();
}
第3。使用
创建新的dbcontext实现using (var db = new InternTrackingDbContext())
{
var repository = new GenericRepository<AcademicLevel>();
List<AcademicLevel> academic = repository.SelectAll().ToList();
}
4。使用新的直接上下文调用
using (var db = new InternTrackingDbContext())
{
var data = db.Skills;
foreach (var item in data)
{
// console app for testing
Console.WriteLine(item.SkillName + " , id = " + item.Skillid);
}
}
因此,基于上述情况,我确定要展示的关键是我的 GenericRepository
public class GenericRepository<T> : IGenericRepository<T>, IDisposable where T : class
{
private readonly InternTrackingDbContext db;
private DbSet<T> table = null;
public GenericRepository()
{
this.db = new InternTrackingDbContext();
table = db.Set<T>();
}
public GenericRepository(InternTrackingDbContext db)
{
this.db = db;
table = db.Set<T>();
}
public IEnumerable<T> SelectAll()
{
return table.ToList();
}
public T SelectByID(object id)
{
return table.Find(id);
}
public void Insert(T obj)
{
table.Add(obj);
}
public void Update(T obj)
{
table.Attach(obj);
db.Entry(obj).State = EntityState.Modified;
}
public void Delete(object id)
{
T existing = table.Find(id);
table.Remove(existing);
}
public void Save()
{
db.SaveChanges();
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (db != null)
{
db.Dispose();
}
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
我不希望过度复杂化,但要确保 我正在接近这个 2.尽可能以最佳方式调用CRUD方法 3.不保持dbcontext或连接打开
理想情况下我 WOULD 想要说一个HomeController,其中我在页面顶部说了一个私有,但我对 InternTrackingDbContext 和 GenericRepository 就新事物而言。任何人都可以看到更好的方法,你看到的任何代码模型都可以轻松实现吗?