【问题标题】:Application design question应用程序设计问题
【发布时间】:2010-08-18 22:18:22
【问题描述】:

我正在用 ASP.NET MVC 构建网上商店。
我有两个实体:CategoryProduct

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

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

控制器
我应该在 Category 控制器中放置哪些操作,应该在 Product 控制器中放置哪些操作?

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

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

感谢您的帮助!

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    应用程序结构和设计在很大程度上是一个偏好问题。有很多方法可以做对,也有很多方法做错。我会写下我会做什么,你可以接受它的价值......

    我喜欢为我的数据库中的每个对象或表拥有 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

    到:

    Ishop服务

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

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

    【讨论】:

    • 我不知何故不喜欢在存储库架构中使用泛型的方法,因为它将您的“子”存储库锁定到同一组方法,而我通常最终会在不同实体中使用一些不同的方法。但是,如果存储库中只有 Add()、Delete()、Update() 方法,那么我想它可以工作。除此之外,很好的答案。
    • @DM,我将使用 DDD 方法,这就是为什么我只给你接口。如果我需要返回 'Category' 和该类别中的所有 'Products',我是否必须将此方法放在 'CategoryRepository' 或 'ProductRepository' 中?
    • @mare 我的 IRepository 类非常基础,只有 5 或 6 个方法可以实现。我在飞行中输入了我的回复,并发现了一些不正确的地方。请参阅编辑以获取说明。
    • @sljaker 在那种情况下,我会向 ICategoryRepository 询问类别,并在我的 IShopService 中这样做。您对 IShopService 的具体实现应该使用 IProductRepository 和 ICategoryRepository 进行数据访问。工作流程:您的网络应用程序需要一个类别...它从您的 IShopService 调用 FindCategory(int id) 方法...您的 IShopService 的具体实现调用并返回 _categoryRepositry.FindByID(id)...
    【解决方案2】:

    如果操作返回类别,请将其放入类别控制器中。如果它给您返回产品,请将其放入产品控制器中。存储库也是如此。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多