2016-12-14 4 views
1

Я создаю демонстрационный проект Asp.net Web API, я не хочу использовать какой-либо поставщик данных, ни структуру сущностей, ни Ado. сеть.Каков наилучший способ использования в данных памяти в проекте ASP API для Java для демонстрации

Я строю Repository,

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 для хранения списка продуктов в кэше, но это для другой цели и в течение ограниченного периода времени, а также делает сложным изолированное тестирование. Итак, что такое предложение о создании последовательного демонстрационного проекта с продукцией CRUD?

+1

Сделать 'Список товаров' статических. Он будет работать во время работы приложения и служит для демонстрационных целей. – Fabio

+0

* Безопасность резьбы * – Guillaume

ответ

2

Вы хотите, чтобы ваш репозиторий был синглом. Существует несколько способов добиться этого, но если этот демонстрационный код каким-то образом станет работать, я бы предложил интегрировать поставщика инъекций зависимостей в ваш код. Например, вы можете использовать единство.

  • Вы устанавливаете свой репозиторий в виде одиночного контейнера в контейнере.
  • Контроллеры получат интерфейс IProductRepo. Это означает, что если вы решите изменить реализацию на фактического поставщика данных, ваш код не потребуется изменять - вы просто измените регистрацию в своем контейнере DI.

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

  1. Установить Unity.WebAPI пакет NuGet. См 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.
+1

Репозиторий явно не является потокобезопасным. Вы должны быть очень осторожны, когда вы меняете всю жизнь. – Guillaume

+0

Я также использовал Unity в качестве контейнера для инъекций зависимостей, но вместо контейнера.RegisterType << IProductRepo>, > (новый ContainerControlledLifetimeManager()); вместо ContainerControlledLifetimeManager я использовал новый HierarchicalLifetimeManager(), который создавал экземпляр все время, теперь он решен, спасибо –

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