2013-08-02 4 views
0

В настоящее время я работаю над приложением ASP.NET MVC, в котором контроллеры используют репозитории для доступа к данным через ORM Framework.Как правильно реализовать интерфейс в репозитории C#

Ниже приведен базовый пример интерфейсов и репозиториев, используемых моими контроллерами 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(); 
     } 
... 
+1

Сделать 'ICustomerProductRepository' наследовать' IDisposable' вместо определения метода 'Dispose'. – JosephHirn

ответ

2

Ваш интерфейс может наследовать от IDisposable INTERF туз, чтобы иметь метод Dispose. Для образца:

public class CustomerProductRepository : ICustomerProductRepository, IDisposable 
{ 
    // the same code here... 
} 

С этим, вы также можете использовать следующий синтаксис:

using (ICustomerProductRepository repo = new CustomerProductRepository()) 
{ 
    // use repository here... 

} // auto dispose occurs here 
+0

'IDisposable' - это просто интерфейс, он не удалит из памяти ваши ресурсы. На самом деле, этот интерфейс предназначен для неуправляемых ресурсов, которые вы хотите управлять внутри .net, используя interop. Вы хорошо разбираетесь в коде, но если хотите, вы можете реализовать его, используя 'IDisposable', как хорошую оценку. С помощью инструкции 'use', она автоматически утилизируется для вас в качестве образца. –

+0

Ну, у вас есть метод под названием 'Dispose' на вашем собственном интерфейсе, но он является настраиваемым методом и не будет работать как .net framework. Интерфейс 'IDisposable' поставляется из .NET-инфраструктуры, и он добавит некоторые поведения для .net, чтобы он работал нормально, например' using() {} 'scope. Я рекомендую вам добавить в свой интерфейс 'IDisposable':' public interface ICustomerProductRepository: IDisposable {..} '. Ваш код выглядит отлично. –

1

Как уже упоминалось Фелипе, Ключевым моментом здесь является использование IDisposable. GC может вызывать IDisposable. Автоматически решать, когда он запускается, поэтому вам не нужно беспокоиться. Вы также можете обратиться сюда: 1

Смежные вопросы