2016-12-14 1 views
1

Je construis le projet de démonstration Asp.net Web API, je ne veux utiliser aucun fournisseur de données, ni cadre d'entité, ni Ado. net.Quel est le meilleur moyen d'utiliser les données de la mémoire dans le projet API Web Asp.net pour la démo

Je construis le dépôt,

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; 
    } 
} 

Mais, dans chaque coup de l'application, une nouvelle instance de la classe ProductRepo est créée, de sorte que même si je sauvegarder les données, il n'a jamais persisté.

De plus, j'ai la possibilité d'utiliser System.Web.Cache pour contenir la liste de produits dans Cache, mais c'est pour un but différent et pour une période de temps limitée, ce qui rend également les tests unitaires difficiles. Alors, quelle est la suggestion de construire le projet de démonstration successif avec les produits CRUD?

+1

Rendre les produits 'List ' statiques. Il fonctionnera pendant l'exécution de l'application et servira à des fins de démonstration. – Fabio

+0

* Sécurité du filetage * – Guillaume

Répondre

2

Vous souhaitez que votre référentiel soit un singleton. Il y a plusieurs façons d'y parvenir, mais si ce code de démonstration devait devenir opérationnel d'une manière ou d'une autre, je suggérerais d'intégrer un fournisseur d'injection de dépendances dans votre code. Par exemple, vous pouvez utiliser l'unité.

  • Vous configurez votre référentiel en tant que singleton dans le conteneur.
  • Vos contrôleurs recevront l'interface IProductRepo. Cela signifie que si vous décidez de changer l'implémentation à un fournisseur de données réel, votre code n'aura pas besoin de changer - vous modifierez simplement l'enregistrement dans votre conteneur DI.

Voici quelques ressources pour vous aider à démarrer si vous voulez mettre en œuvre ce chemin:

  1. Installer Unity.WebAPI package NuGet. Voir http://www.devtrends.co.uk/blog/introducing-the-unity.webapi-nuget-package
  2. Dans votre dossier App_Start, ajoutez une classe UnityConfig statique:

    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. Dans votre fichier Global.asax, ajoutez la ligne suivante: UnityConfig.RegisterComponents();

  4. maintenant dans le constructeur de votre contrôleur, il suffit de passer un membre de type IProductRepo. Ceci sera initialisé pour vous par Unity, et sera la même instance à chaque application touchée car elle est créée une fois par Unity.
+1

Le référentiel n'est clairement pas sécurisé pour les threads. Vous devez être vraiment prudent lorsque vous changez la durée de vie. – Guillaume

+0

J'utilisais également l'Unity comme un conteneur d'injection de dépendances, mais, au lieu de container.RegisterType << IProductRepo>, > (new ContainerControlledLifetimeManager()) ;, Au lieu de ContainerControlledLifetimeManager, j'utilisais new HierarchicalLifetimeManager(), qui créait instance tout le temps, maintenant il est résolu, merci –