我一直在尝试在项目中实现存储库模式。我不确定我是否正确使用处置。我从实体框架的MVA课程中获取了模式。
我的资料库
public static bool IsAwesome { get { return true; } }
public class Repository<T> : IDisposable where T : class
{
private ApplicationDbContext db = null;
protected DbSet<T> DbSet { get; set; }
public Repository()
{
db = new ApplicationDbContext();
DbSet = db.Set<T>();
}
public List<T> GetAll()
{
return DbSet.ToList();
}
public T Get(int id)
{
return DbSet.Find(id);
}
public T GetWithString(string id)
{
return DbSet.Find(id);
}
public void Add(T entity)
{
DbSet.Add(entity);
}
public void Update(T entity)
{
DbSet.Attach(entity);
db.Entry(entity);
}
public void SaveChanges()
{
db.SaveChanges();
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
db.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
从存储库继承的imageRepository示例
public class ImageRepository : Repository<Image>
{
public Image GetLatest(int vehicleId)
{
return DbSet.FirstOrDefault(p => p.VehicleId == vehicleId);
}
public List<Image> GetImagesByVehicleId(int vehicleId)
{
return DbSet.Where(p => p.VehicleId == vehicleId).ToList();
}
}
在控制器顶部使用我的存储库并将其置于控制器底部
ImageRepository imageRepository = new ImageRepository();
UserRepository userRepository = new UserRepository();
protected override void Dispose(bool disposing)
{
imageRepository.Dispose();
userRepository.Dispose();
base.Dispose(disposing);
}
我的代码是否会处理所有非托管连接并正确关闭它们?
提前谢谢你。我对MVC和EF还有点新意。如果我的问题有点新鲜,我很抱歉。我在这里的第一篇文章。所以我希望我没有违反任何规则:)
答案 0 :(得分:0)
在UnitOfWork中添加您的Dispose代码,从GenericRepository中删除
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
Context.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
答案 1 :(得分:0)
我的代码是否会处理所有非托管连接并关闭它们 正确?
显然是的。
但是,你并没有完全遵循这种模式。您没有必须使用SuppressFinalize,因为您的课程中没有终结器。请阅读proper implementation of IDisposable Pattern。