DDD - 管理域和存储库之间的耦合

时间:2015-06-19 14:44:24

标签: domain-driven-design encapsulation hexagonal-architecture

我的问题非常简单:如何将我的班级私人数据存入存储库以保存?

无论我们采用何种建筑风格,每个人都同意业务对象不应该知道"如何"保存自己 - 也就是说他们不应该实现数据库或其他持久性细节。但是,在我看来,业务对象是唯一知道"什么"他们需要保存。存储库知道如何从数据库中获取,但如果要知道如何将业务对象转换为数据库术语,那么它必须知道要转换的内容

考虑一下我可能会使用数据库,但我没有用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);

我知道有一些框架可以帮助我,但最终,它们都依赖于某种反思。我想知道,在没有反射的情况下,我如何静态组合我的对象以在保持封装的同时公开他们的数据。我能想出的唯一答案是这种访客模式。

2 个答案:

答案 0 :(得分:1)

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

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

这样的东西
var myImageView:UIImageView?
    var rotation = CABasicAnimation(keyPath: "transform.rotation")
    rotation.fromValue = 0.0
    rotation.toValue = 2*M_PI
    rotation.duration = 1.1
    rotation.repeatCount = Float.infinity
    myImageView?.layer.addAnimation(rotation, forKey: "Spin")

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

Btw,出口商,考虑到其目的,应该只与公众成员打交道,对象不应该知道它。

答案 1 :(得分:1)

我倾向于同意@MikeSW认为外部持久性工具能够收集域对象状态,借助于小范围调整(或ORM所做的反射),通常比让域对象本身完全控制是什么更简单持续存在。

第三种方法是让实体发出描述发生事件的事件,而不是暴露其状态 - 即事件采购。然后,任何想要的人都可以听取他们的意见并坚持以他们想要的任何形式进行变革。