[英]How to correctly implement an interface on a C# repository
我目前正在研究ASP.NET MVC應用程序,其中的控制器使用存儲庫通過實體框架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();
}
...
您的接口可以繼承自IDisposable
接口以具有Dispose
方法。 樣品:
public class CustomerProductRepository : ICustomerProductRepository, IDisposable
{
// the same code here...
}
這樣,您還可以使用以下語法:
using (ICustomerProductRepository repo = new CustomerProductRepository())
{
// use repository here...
} // auto dispose occurs here
正如Felipe提到的,這里的關鍵是使用IDisposable。 GC可以在運行時自動調用IDisposable.Dispose,因此您不必擔心。 您也可以在這里參考: 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.