我的问题很简单:如何将我班级的私有数据保存到存储库中?
不管我们采用何种架构风格,每个人都同意业务对象不应该知道“如何”保存自己——也就是说,它们不应该实现数据库或其他持久性细节。但是,在我看来,业务对象是唯一知道他们需要保存“什么”的对象。Repository 知道如何从数据库中获取,但如果它要知道如何将业务对象翻译成数据库术语,那么它必须知道要翻译什么。
考虑到我可能使用数据库,但我没有用休眠注释标记我的类,因为我可能经常保存到平面文本文件中。
假设我在这里的课程实际上是以特定的业务实体命名的,那么做类似的事情会有什么问题
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);
我知道有一些框架可以帮助我,但归根结底,它们都依赖于某种反射。我想知道,在没有反射的情况下,我如何静态组合我的对象以在保持封装的同时公开它们的数据。我能想出的唯一答案是这种访问者模式。