我想根据对象的类型对对象执行一些操作(数据库持久性、json 序列化等)。多态是执行此操作的常用方法,但我不想在我的模型中添加很多非业务逻辑。
这是一个简单的类型层次结构(这些不是我的原始类型,而是显示问题的简化):
public abstract class Book
{
public int Id { get; set; }
public string Title { get; set; }
}
public class PrintBook : Book
{
public decimal Weight { get; set; }
public CoverType CoverType { get; set; }
}
public class Ebook : Book
{
public EbookType Type { get; set; }
public bool AutoUpgrade { get; set;}
}
这些书在客户端作为 JS 对象创建,然后,它们以 JSON 的形式发送到服务器(我无法更改其结构),以解析为书籍列表:
public List<Book> ParseJson(string json)
{
/* JSON sample (in JS we have duck typing - the type is determined by its members)
"books": [
{ "id": 1, "title": "Sample print book", "weight": 50, "coverType": "soft" },
{ "id": 2, "title": "Sample ebook", "type": "pdf", "autoUpgrade": true }
]
*/
}
然后,我想将此列表保存到数据库中:
public void SaveBooksToDatabase(List<Book> books)
{
foreach (var book in books)
{
if (book is Ebook)
{
Save((Ebook)book);
}
else if (book is PrintBook)
{
Save((PrintBook)book);
}
}
}
public void Save(Ebook ebook) { /* */ }
public void Save(PrintBook printBook) { /* */ }
我对 SaveBooksToDatabase 方法中的类型调度不满意:它违反了开闭原则,并且在我们添加新类型时不是很安全。
但是我不想在书籍层次结构中添加抽象的 Save() 方法,因为除了保存之外还有更多类型相关的操作(例如 json 序列化),这将违反单一责任原则。我知道访问者模式可能被认为是一种替代解决方案,但 IMO 它会引入更多混乱的样板代码。
处理此类案件的最佳和最优雅的方法是什么?