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

What is the best way to use in memory data in Asp.net Web API project for demo

我正在构建 Asp.net Web API 演示项目,我不想使用任何数据提供程序,entity framework 和 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 class 的新实例,因此即使我保存了数据,它也不会持续存在。

此外,我可以选择使用 System.Web.Cache 将产品列表保存在缓存中,但它的用途不同且时间有限,这也使独立的单元测试变得困难.那么,构建带有产品CRUD操作的后续演示项目有什么建议?

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

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

如果您想实施此路径,这里有一些可帮助您入门的资源:

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

    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 创建一次。