我的问题很简单:如何让我的类的私有数据存储到存储库?不管我们采用的架构风格如何,每个人都同意业务对象不应该知道如何保存自己 - 也就是说他们不应该实现数据库或其他持久性细节。但是,在我看来,只有业务对象知道他们需要保存的“什么”。知识库知道如何从数据库中获取数据,但如果知道如何将业务对象转换为数据库术语,那么它必须知道要翻译什么。DDD - 管理域和存储库之间的耦合
考虑一下我可能会使用数据库,但是我不会用hibernate注释标记我的类,因为我可能经常保存到一个平面文本文件。
假设我的课在这里具体业务实体后实际命名的,什么是错做这样的事情
interface Exporter
{
public void Export(String id, String value1, String value2);
}
interface Repository
{
public Entity FindById(String id);
}
class Entity
{
private String id;
private String value1;
private String value2;
private String derivedvalue;
public Entity() {}
public Entity(String id, String value1, String value2)
{
this.id = id;
this.value1 = value1;
this.value2 = value2;
this.derivedvalue = /* derived from id, value1, and value2 */;
}
public void DoBusiness()
{
// ...
}
public void Export(Exporter exporter)
{
Exporter.Export(this.id, this.value1, this.value2);
}
}
,并使用它像
FlatFileRepositoryAndExporter flatfile = new FlatFileRepositoryAndExporter(...);
Entity entity = flatfile.FindById(...);
// Do business logic
entity.DoBusiness();
entity.Export(flatfile);
据我所知,是可以帮助框架我,但在一天结束时,他们都依赖某种反思。我想知道,没有反思,我如何静态构造我的对象来暴露他们的数据,同时保持封装。我能拿出的唯一答案就是这种访问者模式。
这很好。我做了一些类似的事情,我将依赖关系注入到实体中以执行各种事情(如持久化),并且对我来说工作得非常好。 –
访问者模式没问题,但它为域实体增加了一些噪音。你说得对,所有的框架和持久性客户端都使用反射保存和检索对象。最简单的是一个没有任何映射的xml或json序列化工具。 NoSQL数据库通常也是一样的。将持久性逻辑添加到您的域会迫使您开始测试它,这不是域测试的一部分。如果要序列化为某个文件,则始终可以将存储库实现为通用列表,并使用一些序列化将其保存到文件系统。 –