我目前正在开发一个ASP.NET MVC应用程序,其中控制器使用存储库通过Entity Framework ORM访问数据。
以下是我的ASP.NET MVC控制器用于访问数据的接口和存储库的基本示例。
我在GC Gen2内存中遇到了大量的存储库,我想知道它是否是我设计模式的结果?
对此有任何建议将不胜感激。我知道架构可以改进,这样的评论也会受到赞赏,但我主要关注的是我的高内存使用率。
控制器
[SessionState(SessionStateBehavior.ReadOnly)]
public class GridCustomerServiceController : Controller
{
private ICustomerServiceRepository _customerServiceRepository { get; set; }
#region Constructor
public GridCustomerServiceController()
{
_customerServiceRepository = new CustomerServiceRepository();
}
#endregion Constructor
#region Overrides
protected override void Dispose(bool disposing)
{
this._customerServiceRepository.Dispose();
base.Dispose(disposing);
}
#endregion Overrides
[GridAction]
[Authorize(Roles = "user")]
public ActionResult _CustomerServicesSelect()
{
return View(new GridModel
{
Data =
(_customerServiceRepository.GetServicesByCustomerId(1))
});
}
界面
using System.Linq;
public interface ICustomerProductRepository
{
void Dispose();
IQueryable<CustomerProduct> GetProductObjectsByCustomerId(int cid);
void Add(Customer b);
void Delete(Customer c);
void Save();
}
存储库
public class CustomerProductRepository : ICustomerProductRepository
{
private myEntities db = new myEntities();
#region Dispose Methods
~CustomerProductRepository()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (db != null)
{
db.Dispose();
db = null;
}
}
#endregion Dispose Methods
public void Delete(CustomerProduct c)
{
db.CustomerProducts.DeleteObject(c);
}
public void Save()
{
db.SaveChanges();
}
public void AddCustomerProduct(CustomerProduct b)
{
db.AddToCustomerProducts(b);
db.SaveChanges();
}
...
答案 0 :(得分:2)
您的界面可以从IDisposable
界面继承,以获得Dispose
方法。样本:
public class CustomerProductRepository : ICustomerProductRepository, IDisposable
{
// the same code here...
}
有了这个,您还可以使用以下语法:
using (ICustomerProductRepository repo = new CustomerProductRepository())
{
// use repository here...
} // auto dispose occurs here
答案 1 :(得分:1)
正如费利佩所说,这里的关键是使用IDisposable。 GC可以在运行时自动调用IDisposable.Dispose,因此您无需担心。您也可以在此处参考:1