应用设计问题

时间:2010-08-17 12:40:49

标签: asp.net-mvc

我正在使用ASP.NET MVC构建网上商店 我有两个实体:类别产品

一个产品可以属于一个或多个类别

在网页上,用户可以看到类别列表。通过单击类别名称,他可以查看该类别中的所有产品。用户还可以按名称,类别,价格等搜索产品。

控制器
我应该在 Category 控制器中添加哪些操作以及我应该将哪些操作放在 Product 控制器中?

存储库
我是否需要两个存储库(每个实体一个),如果我这样做,哪些方法属于哪个存储库:

IList<Category> GetCategories();
IList<Product> GetProducts(int categoryId);
Product GetProductById(int productId);
IList<Product> GetProducts(string name, decimal? minPrice, decimal? maxPrice);

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

应用程序结构和设计在很大程度上是一个偏好问题。有很多方法可以做到这一点,并且有很多方法可以做错。我会写下我会做的事情,你可以把它当作值得的......

我喜欢为我的数据库中的每个对象或表提供一个简单的数据访问存储库。我通常让这些存储库实现一个简单的通用接口。然后,我构建一个“服务”或“提供者”,实现每个简单的接口,并将“聚合”的所有功能集中到一个地方。 “聚合”是指一组所有共享相似功能的类和对象(即博客,商店,日志记录等)。我一直在寻找一种更好的方法来处理这个问题,但这是对我将使用的类和接口的粗略估计:

// interfaces
IRepository<T>
IProductRepository : IRepository<Product>
ICategoryRepository : IRepository<Category>
IShopService

// concrete implementations
LinqToSqlProductRepository : IProductRepository
LinqToSqlCategoryRepository : ICategoryRepository
ShopService : IShopService

关于控制器上的操作方法是什么?我很少发现基本RESTful方法不起作用的场景。使用“添加”,“列表”,“显示”,“删除/销毁”,“编辑”操作时,您无法做太多事情。

// example ProductController
Add()
Add(ProductAddModel)
Delete(int id)
Edit(int id)
Edit(ProductEditModel)
List(int page)
Show(int id)

修改

看了之后我改变了签名:

IShopService:IProductRepository,ICategoryRepository

为:

IShopService

原因是因为我在IProductRepository和ICategoryRepository后面使用通用接口,所以当你去实现IShopService时,你将有多个Add(),Delete(),FindAll(),FindByID(),等方法;只有他们的参数不同。

更好的方法是单独使用IShopService接口,并使该接口的具体实现与IProductRepository和ICategoryRepository一起使用。

答案 1 :(得分:0)

如果操作为您提供了类别,请将其放入类别控制器中。如果它为您提供产品,请将其放入产品控制器中。同样适用于存储库。

这很简单,但我认为它适用于您的情况。