Я создал свой поставщик данных, используя Шаблон репозитория.
Сначала я спроектировал базовый интерфейс репозитория следующим образом:
internal interface IGenericRepository<T, in TResourceIdentifier>
{
Task<IEnumerable<T>> GetManyAsync();
Task<T> GetAsync(TResourceIdentifier id);
Task PutAsync(T model);
Task<T> PostAsync(T model);
Task DeleteAsync(TResourceIdentifier id);
}
Затем я реализовал его:
public class GenericRepository<T, TResourceIdentifier> : IDisposable, IGenericRepository<T, TResourceIdentifier>
where T : class
{
private bool _disposed;
protected HttpClientHelper<T, TResourceIdentifier> Client;
protected GenericRepository(string addressSuffix)
{
Client = new HttpClientHelper<T, TResourceIdentifier>(Properties.Settings.Url, addressSuffix);
}
public async Task<IEnumerable<T>> GetManyAsync()
{
return await Client.GetManyAsync();
}
// All other CRUD methods and dispose
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if(_disposed || !disposing) return;
if(Client != null)
{
var mc = Client;
Client = null;
mc.Dispose();
}
_disposed = true;
}
}
Затем я создал собственный интерфейс репозитория для каждого из моихюридические лица.Например:
internal interface IOrderRepository : IGenericRepository<Order, int>
{
Task<IEnumerable<Order>> GetOrderBySomeConditionAsync(string condition );
}
И наконец, я реализовал пользовательский репозиторий:
public class OrderRepository : GenericRepository<Order, int>, IOrderRepository
{
public OrderRepository(string addressSuffix) : base(addressSuffix)
{
}
public async Task<IEnumerable<Order>> GetOrderBySomeConditionAsync(string condition)
{
//get all the orders (GetManyAsync()) and then returns the ones meeting the condition
}
}
Обратите внимание, что HttpClientHelper
использует HttpClient
и должен быть удален вручную.
Я создал веб-приложение MVC и определил хранилища на уровне класса следующим образом:
IOrderRepository _orderRepository = new OrderRepository();
Когда я вызываю _orderRepository
в моих операциях CRUD, оно не удаляет утилиту утилизации.после его использования.Чтобы исправить это, я реализовал так:
private async Task<IEnumerable<OrderViewModel>> GetOrders()
{
using(var orderRepository = new OrderRepository())
return await orderRepository.GetManyAsync();
}
Это ударило бы по Dispose, но это анти-паттерн.
Что мне не хватает в моей реализации, чтобы экземпляр не располагался при каждом вызове?