我正在尝试为我的大型 ASP.NET MVC 应用程序创建业务层和数据层。因为这是我第一次尝试这种规模的项目,所以我正在阅读一些书籍,并努力小心地将事物正确地分开。通常,我的应用程序混合了业务逻辑和数据访问层,并且多个业务实体在单个类中交织在一起(当我试图弄清楚在哪里添加内容时,这让我很困惑)。
我读过的大部分内容都是将业务层和数据层分开。这看起来一切都很好,但我很难想象在某些情况下如何做到这一点。例如,假设我正在创建一个允许管理员向系统添加新产品的系统:
public class Product
{
public int Id { get; private set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
然后我通过创建存储库来分离数据访问
public class ProductRepository
{
public bool Add(Product product);
}
假设我想要要求产品名称至少包含 4 个字符。我不知道如何干净地做到这一点。
我的一个想法是扩展 Name 的 set 属性,并且仅在长度为 4 个字符时才设置它。但是,创建产品的方法无法知道名称未设置,除非 Product.Name != 他们传入的任何内容。
我的另一个想法是将它放在存储库中的 Add() 方法中,但随后我的业务逻辑和数据逻辑就在那里,这也意味着如果 Add 调用失败,我不知道它是否失败了业务逻辑或因为 DAL 失败(这也意味着我无法使用模拟框架测试它)。
我唯一能想到的就是将我的 DAL 内容放在第三层中,该第三层从存储库中的 Add() 方法调用,但我在我的书或网站上的任何域建模示例中都没有看到这一点。网络(至少我见过)。当我不确定是否需要时,它还会增加域模型的复杂性。
另一个示例是希望确保名称仅由一个产品使用。它会放在 Product 类、ProductRepository Add() 方法中还是哪里?
附带说明一下,我计划使用 NHibernate 作为我的 ORM,但是,要实现我想要的目标(理论上),我使用什么 ORM 并不重要,因为 TDD 应该能够隔离所有这些。
提前致谢!