在Asp.net Web API项目中用于演示的内存数据的最佳方法是什么

时间:2016-12-14 06:11:43

标签: c# asp.net asp.net-web-api in-memory-database

我正在构建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 个答案:

答案 0 :(得分:2)

您希望您的存储库是单例。有多种方法可以实现这一点,但如果这个演示代码将以某种方式运行,我建议将依赖注入提供程序集成到您的代码中。例如,您可以使用unity。

  • 您将存储库设置为容器中的单例。
  • 您的控制器将通过IProductRepo接口。这意味着如果您决定将实施更改为实际的数据提供者,则您的代码无需更改 - 您只需更改DI容器中的注册。

如果您想要实现此路径,可以使用以下资源来帮助您入门:

  1. 安装Unity.WebAPI nuget包。请参阅http://www.devtrends.co.uk/blog/introducing-the-unity.webapi-nuget-package
  2. 在App_Start文件夹中,添加一个静态UnityConfig类:

    gcc -rdynamic ./libfoo.so -Wl,-rpath=/home/user/foo -Wall -o test main.c -lfoo
    
  3. 在您的Global.asax文件中,添加以下行: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); } }

  4. 现在在控制器的构造函数中,只需传递IProductRepo类型的成员。这将由Unity为您初始化,并且每个应用程序命中都是相同的实例,因为它由Unity创建一次。