在用于演示的 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 容器中的注册即可。
如果您想实施此路径,这里有一些可帮助您入门的资源:
- 安装Unity.WebAPI nuget 包。参见 http://www.devtrends.co.uk/blog/introducing-the-unity.webapi-nuget-package
在您的 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);
}
}
在您的 Global.asax 文件中,添加以下行:UnityConfig.RegisterComponents();
- 现在在控制器的构造函数中,只需传递一个 IProductRepo 类型的成员。这将由 Unity 为您初始化,并且每次应用程序点击都是相同的实例,因为它是由 Unity 创建一次。
我正在构建 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 容器中的注册即可。
如果您想实施此路径,这里有一些可帮助您入门的资源:
- 安装Unity.WebAPI nuget 包。参见 http://www.devtrends.co.uk/blog/introducing-the-unity.webapi-nuget-package
在您的 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); } }
在您的 Global.asax 文件中,添加以下行:
UnityConfig.RegisterComponents();
- 现在在控制器的构造函数中,只需传递一个 IProductRepo 类型的成员。这将由 Unity 为您初始化,并且每次应用程序点击都是相同的实例,因为它是由 Unity 创建一次。