Wie man richtig eine Schnittstelle implementieren, über eine C# - repository
Derzeit arbeite ich an einer ASP.NET MVC-Anwendung in die Controller verwenden Repositorys für den Zugriff auf Daten über Entity-Framework-ORM.
Unten ist ein einfaches Beispiel für die Schnittstellen und Repositorys verwendet, die durch meine ASP.NET MVC-Controller-Daten zugreifen.
Erlebe ich hohe zahlen meiner repositories Links in den GC-Gen2-Speicher und ich fragte mich, ob es war, wie ein Ergebnis von meinem design-pattern?
Jede Beratung auf diesem würde geschätzt. Ich verstehe, dass die Architektur verbessert werden können und solche Kommentare würde auch geschätzt werden, aber mein Hauptaugenmerk umgibt meine hohe Speicherauslastung.
Der Controller
[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))
});
}
Die Schnittstelle
using System.Linq;
public interface ICustomerProductRepository
{
void Dispose();
IQueryable<CustomerProduct> GetProductObjectsByCustomerId(int cid);
void Add(Customer b);
void Delete(Customer c);
void Save();
}
Repository
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();
}
...
- Machen
ICustomerProductRepository
ErbenIDisposable
statt der Festlegung einerDispose
Methode.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Schnittstelle könnte Erben von der
IDisposable
- Schnittstelle zu haben, dieDispose
Methode. Zum Beispiel:Mit dabei, Sie können auch die folgende syntax verwenden:
IDisposable
ist nur ein interface, es wird nicht entfernen von Speicher-Ressourcen. In der Tat, diese Schnittstelle ist für nicht verwaltete Ressourcen, die Sie verwalten wollen, im inneren .net mit interop. Ihr code sieht in Ordnung, aber wenn Sie möchten, können Sie implementieren es mitIDisposable
als eine gute Praxis. Mit derusing
Aussage, es entsorgen Sie automatisch für Sie, wie mein Beispiel.Dispose
auf Ihre eigene Schnittstelle, aber es ist eine benutzerdefinierte Methode, und wird nicht funktionieren, wie .net framework benötigen. DieIDisposable
Schnittstelle kommt .net framework, und es wird einige Verhaltensweisen auf .net bekommen, es funktioniert gut, wieusing() { }
Umfang. Ich empfehle Ihnen, fügen Sie auf Ihrer Oberfläche dieIDisposable
:public interface ICustomerProductRepository : IDisposable { .. }
. Dein code sieht gut aus.Als Felipe erwähnt, Der Schlüssel hier ist die Verwendung von IDisposable. GC aufrufen können Sie die IDisposable.Entsorgen Sie automatisch, wenn es läuft, so müssen Sie sich keine sorgen. Weitere Informationen finden Sie auch hier: Eins