2

我的问题很简单:如何让我的类的私有数据存储到存储库?不管我们采用的架构风格如何,每个人都同意业务对象不应该知道如何保存自己 - 也就是说他们不应该实现数据库或其他持久性细节。但是,在我看来,只有业务对象知道他们需要保存的“什么”。知识库知道如何从数据库中获取数据,但如果知道如何将业务对象转换为数据库术语,那么它必须知道要翻译什么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); 

据我所知,是可以帮助框架我,但在一天结束时,他们都依赖某种反思。我想知道,没有反思,我如何静态构造我的对象来暴露他们的数据,同时保持封装。我能拿出的唯一答案就是这种访问者模式。

+0

这很好。我做了一些类似的事情,我将依赖关系注入到实体中以执行各种事情(如持久化),并且对我来说工作得非常好。 –

+0

访问者模式没问题,但它为域实体增加了一些噪音。你说得对,所有的框架和持久性客户端都使用反射保存和检索对象。最简单的是一个没有任何映射的xml或json序列化工具。 NoSQL数据库通常也是一样的。将持久性逻辑添加到您的域会迫使您开始测试它,这不是域测试的一部分。如果要序列化为某个文件,则始终可以将存储库实现为通用列表,并使用一些序列化将其保存到文件系统。 –

回答

1

我倾向于认同@MikeSW,使得外部持久化工具能够通过小范围调整(或者像ORM那样反射)来收集域对象状态,这通常比让域对象本身完全控制什么更简单被坚持。

还有第三种方法是让实体发出描述发生的事件而不是暴露其状态的事件 - 即事件采购。然后,任何想要的人都可以倾听他们的声音,并以他们想要得到的任何形式坚持改变。

1

不要让你的生活过于复杂。你试图做的基本上是一个纪念品,它可以工作,但它有很高的维护成本(如非常无聊)。我通常json序列化的东西,无论我实际存储他们,我已配置json.net序列化保护的属性。所以基本上,我有保护属性或只是受保护的setter,它工作得很好。

虽然不是一个纯粹的解决方案,妥协是非常低的,对象的内部不暴露给其用户。你可以有像

private List<string>_data=new List<string>(); 
public IEnumerable<string> Data 
{ 
    get { return _data;} 
    protected set { _data=value.ToList(); } 

} 

这种方法很简单,非常可维护和持久性工具不可知论。

顺便说一句,出口商,考虑到它的目的,应该只处理公众成员,对象不应该知道它。