Как лучше всего использовать данные в памяти в проекте Asp.net Web API для демонстрации
Я создаю демонстрационный проект Asp.net Web API, я не хочу использовать ни провайдера данных, ни платформу сущностей, ни Ado.net.
Я строю хранилище,
public class ProductRepo : IProductRepo
{
private List<Product> products = new List<Product>();
private int _nextId = 1;
public ExternalProductDataRepo()
{
products.Add(new Product {Id=1, Name = "Toyata", Category = "Car", Price = 1.3M });
products.Add(new Product {Id=2, Name = "Ford", Category = "Car", Price = 3.75M });
products.Add(new Product {Id=3, Name = "Hammer", Category = "Hardware", Price = 16.99M });
}
public IEnumerable<Product> GetAll()
{
return products;
}
public Product Get(int id)
{
return products.Find(p => p.Id == id);
}
public Product Add(Product item)
{
if (item == null)
{
throw new ArgumentNullException("item");
}
item.Id = _nextId++;
products.Add(item);
return item;
}
public void Remove(int id)
{
products.RemoveAll(p => p.Id == id);
}
public bool Update(Product item)
{
if (item == null)
{
throw new ArgumentNullException("item");
}
int index = products.FindIndex(p => p.Id == item.Id);
if (index == -1)
{
return false;
}
products.RemoveAt(index);
products.Add(item);
return true;
}
}
Но при каждом обращении к приложению создается новый экземпляр класса ProductRepo, поэтому, несмотря на сохранение данных, они никогда не сохраняются.
Кроме того, у меня есть возможность использовать System.Web.Cache для хранения списка продуктов в Cache, но это для другой цели и в течение ограниченного периода времени, а также затрудняет изолированное модульное тестирование. Итак, каково предложение построить последовательный демонстрационный проект с использованием продуктов CRUD?
1 ответ
Вы хотите, чтобы ваш репозиторий был синглтоном. Есть несколько способов добиться этого, но если этот демо-код каким-то образом заработает, я бы предложил интегрировать поставщика внедрения зависимостей в ваш код. Например, вы можете использовать единство.
- Вы устанавливаете свой репозиторий как одноэлементный контейнер.
- Ваши контроллеры получат интерфейс IProductRepo. Это означает, что если вы решите изменить реализацию на фактического поставщика данных, ваш код не нужно будет менять - вы просто измените регистрацию в своем контейнере DI.
Вот несколько ресурсов, которые помогут вам начать работу, если вы хотите реализовать этот путь:
- Установите пакет Nuget для Unity.WebAPI. См. http://www.devtrends.co.uk/blog/introducing-the-unity.webapi-nuget-package
В вашей папке App_Start добавьте статический класс UnityConfig:
public static class UnityConfig { public static void RegisterComponents() { var container = new UnityContainer(); container.RegisterType<<IProductRepo>,<ProductRepo>> (new ContainerControlledLifetimeManager()); container.Resolve<IProductRepo>(); GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container); } }
В файле Global.asax добавьте следующую строку:
UnityConfig.RegisterComponents();
- Теперь в конструкторе вашего контроллера просто передайте член типа IProductRepo. Это будет инициализировано для вас Unity и будет одним и тем же экземпляром при каждом обращении к приложению, поскольку оно было создано Unity один раз.