Как лучше всего использовать данные в памяти в проекте 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.

Вот несколько ресурсов, которые помогут вам начать работу, если вы хотите реализовать этот путь:

  1. Установите пакет Nuget для Unity.WebAPI. См. http://www.devtrends.co.uk/blog/introducing-the-unity.webapi-nuget-package
  2. В вашей папке 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);
        }
    }
    
  3. В файле Global.asax добавьте следующую строку: UnityConfig.RegisterComponents();

  4. Теперь в конструкторе вашего контроллера просто передайте член типа IProductRepo. Это будет инициализировано для вас Unity и будет одним и тем же экземпляром при каждом обращении к приложению, поскольку оно было создано Unity один раз.
Другие вопросы по тегам