我正在尝试遵循一些更流行的设计原则,包括 SOLID 和领域驱动设计。我的问题是关于人们如何处理“初始化”域对象。
这是一个简单的例子:
基于SOLID,我不应该依赖混凝土,所以我创建了一个接口和一个类。由于我正在利用领域驱动设计,因此我使用相关方法创建了一个对象。(即不贫血)。
Interface IBookstoreBook
{
string Isbn {get; set;}
int Inventory {get; set;}
void AddToInventory(int numBooks);
void RemoveFromInventory(int numBooks);
}
public class BookstoreBook : IBookstoreBook
{
public string Isbn {get; set;}
public int Inventory {get; private set;}
public void AddToInventory(int numBooks);
public void RemoveFromInventory(int numBooks);
}
为了帮助测试和更松耦合,我还使用 IoC 容器来创建本书。所以当这本书被创建时,它总是被创建为空的。但是,如果一本书没有 ISBN 和 Inventory,则它是无效的。
BookstoreBook(string bookISBN, int bookInventory) {..} // Does not exist
我可以有 4 或 5 个使用 BookstoreBook 的不同类。一方面,
public class Bookstore : IBookstore
{
...
public bool NeedToIncreaseInventory(BookstoreBook book) { ...}
...
}
任何方法如何知道得到一本有效的书?我下面的解决方案似乎违反了“告诉不要问”的原则。
a) 每种使用书店书籍的方法都应该测试有效性吗?(即需要NeedToIncreaseInventory 测试书籍的有效性?我不确定它应该知道什么使BookstoreBook 有效。)
b)我是否应该在 IBookstoreBook 对象上有一个“CreateBook”,并且只是“假设”客户知道他们必须在他们想要初始化 BookstoreBook 的任何时候调用它?这样,NeedToIncreaseInventory 就会相信 BookstoreBook 上已经调用了“CreateBook”。
我对这里推荐的 appreach 感兴趣。