动态添加新项目到IQueryable硬编码假存储库

rem*_*rem 7 c# list iqueryable

在使用真实数据库之前构建一个应用程序,只是为了让事情有效我可以先使用硬编码列表作为虚假的内存存储库:

public class FakeProductsRepository 
{
    private static IQueryable<Product> fakeProducts = new List<Product> {
        new Product{ ProductID = "xxx", Description = "xxx", Price = 1000},
        new Product{ ProductID = "yyy", Description = "xxx", Price = 2000},
        new Product{ ProductID = "zzz", Description = "xxx", Price = 3000}
    }.AsQueryable();

    public IQueryable<Product> Products
    {
        get { return fakeProducts; }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何向此类添加方法以动态地在此列表中添加新的,而不是硬编码的项目?

dtb*_*dtb 13

只需将List <Product>保存在List <Product>类型的字段中,而不是IQueryable <Product>:

public class FakeProductsRepository 
{
    private readonly List<Product> fakeProducts = new List<Product>
    {
        new Product { ProductID = "xxx", Description = "xxx", Price = 1000 },
        new Product { ProductID = "yyy", Description = "xxx", Price = 2000 },
        new Product { ProductID = "zzz", Description = "xxx", Price = 3000 },
    };

    public void AddProduct(string productID, string description, int price)
    {
        fakeProducts.Add(new Product
        {
            ProductID = productID,
            Description = description,
            Price = price,
        });
    }

    public IQueryable<Product> Products
    {
        get { return fakeProducts.AsQueryable(); }
    }
}
Run Code Online (Sandbox Code Playgroud)


Laz*_*rus 5

如果你打算将你的存储库Mock用于测试目的,那么我建议你首先声明一个包含你期望从你的存储库中获得的函数的接口.然后构建你的真实和你的'假'存储库来实现该接口,否则你将无法轻易地替换另一个.

一旦你拥有了这个一致的界面,你会发现它非常容易,这些函数已经被声明了,即

public interface IRepository {
    IQueryable<Products> GetAllProducts();
    Product AddProduct(Product Product);
}

public class FakeRepository : IRepository {
    private static IList<Product> fakeProducts = new List<Product> {
        new Product{ ProductID = "xxx", Description = "xxx", Price = 1000},
        new Product{ ProductID = "yyy", Description = "xxx", Price = 2000},
        new Product{ ProductID = "zzz", Description = "xxx", Price = 3000}
     };

     public IQueryable<Product> GetAllProducts() {
         return fakeProducts.AsQueryable();
     }

     public Product Add(Product Product) {
         fakeProducts.Add(Product);
         return Product;
     }
 }
Run Code Online (Sandbox Code Playgroud)