【问题标题】:Completely new to domain modeling, don't know where to begin完全陌生的领域建模,不知道从哪里开始
【发布时间】:2010-11-30 13:19:48
【问题描述】:

我正在开始一个新项目,我想首先对客户需要存储的数据进行建模。但是,我不知道从哪里开始。到目前为止,我正在尝试为两个简单的实体建模,EventAddress。一个Event 可以有多个Addresses,一个Address 可以与多个Events 关联。这就是我所拥有的:

public class Event
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public List<Address> Addresses { get; set; }
}

public class Address
{
    public int Id { get; set; }
    public string Street { get; set; }
    public string Zip { get; set; }
    public List<Event> Events { get; set; }
}

但是,当我尝试为这两个对象创建测试存储库时遇到了问题。它们具有循环依赖关系:Event 无法填充其 Addresses 列表,直到 Address 完全填充,但 Address 无法填充其 Events 列表,直到 Events 完全填充。这让我相信我不知道自己在做什么。

我已经阅读了很多关于 POCO、DTO、DAO 和 DDD 的内容,但无论我多么努力地理解这些概念,这些概念对我来说都没有多大意义。我刚从大学毕业,直到一周前我才听说过“领域模型”这个词。

从概念上讲,我想做的是首先创建代表我需要存储的数据类型的类(我相信是Entities)。这些类还将包含验证逻辑(这是 POCO 吗?)。之后,我想设置存储库来访问这些对象的集合并填充它们可能具有的任何关系(例如,Event 将填充Addresses 的列表)[这是对持久性的无知吗?]。只有在所有这些都到位之后,我才想创建数据库来保存数据(通过 DAO?ORM 是 DAO 吗?我将如何使用 LINQ-To-SQL 来做到这一点?)。 IoC 在哪里适合所有这些,或者如果我知道我的后端永远不会改变并且我只会访问一个数据库,它是否完全不适合?

如果还不是很明显,我很困惑我应该从哪里开始。我对我想做的事情有一个很好的概念,我只是不知道如何实现它。有人可以就一个好的起点向我提供建议吗?谢谢。

【问题讨论】:

    标签: c# domain-driven-design modeling


    【解决方案1】:

    在您给出的示例中,地址似乎不应该包含对事件的引用,但您需要一个可以找到给定地址的事件的存储库。地址看起来更像是一个值对象。有一个book by Eric Evans,如果您想查看值对象是什么以及它们与实体对象有何不同,可以在线获得其中的一部分。

    就 IOC 容器而言,它们在消除工厂负责为您创建对象的样板工厂代码方面非常有用。当你有一个 IOC 容器时,开发人员会向容器询问你需要的类的实例。这消除了您自己编写工厂的需要。

    据我所知,对持久性的无知是对象本身不关心持久性,它们是存储库模式的来源。您使用存储库作为获取、保存、更新和删除对象的一种方式。对象本身与持久性无关。

    我会将 POCO(普通旧 CLR 对象)视为具有行为但不关注横切关注点的对象。 DTO(数据传输对象)通常是一个几乎没有行为的对象,其目的是将数据从 A 点传送到 B 点。DAO(数据访问对象)用于访问数据库(即存储库)中的数据。 DDD(领域驱动设计)是一组设计原则,可指导您完成正确的设计过程,同时根据您构建软件的领域来考虑您的软件。

    我希望这会有所帮助。

    【讨论】:

    • 这正是我要说的。 :)
    【解决方案2】:

    正如 Michael 指出的那样,Address 在许多领域都是一个«值对象»,但我将假设您有完全有效的论据来使其成为«实体»(id)和«聚合根»(存储库)。

    我自己是 NHibernate 用户,并不了解 Linq-to-SQL 的所有细节。尽管 NHibernate 支持多对多映射,但强烈建议您(如果我在 Hibernate in Action 中没记错的话)在您的域模型中包含关联类(即表示您的引用表的类)。

    事情变得更加明确,以及关联的未来属性,例如主地址的标志,更容易添加。

    使用新模型(Event (1) - (x) EventAddress (x) - (1) Address),记住您必须自己记录双向关联,例如遵循 UML Distilled 中 Fowler 的主从模式。

    使用 NHibernate,您还可以告诉它哪一端是反向的(从属),但您必须查阅 Linq-to-SQL 的文档以了解它是如何实现相同技巧的。

    您可以在此处阅读有关主从关系的更多信息:http://blog.lowendahl.net/?p=88

    【讨论】:

      【解决方案3】:

      从一开始就不要太担心法律条文。

      有一些基本原则导致了模式和方法的字母汤,如果你坚持这些原则,你会发现你的代码在大多数情况下至少会倾向于其中的一些。

      如果您关心模式和概念而不是实际解决问题,那么您可能会选择一种模式来完美解决与您所遇到的问题不同的问题。

      在您描述的示例中,您需要获取每个事件的地址列表,并且您需要获取每个地址的事件列表。

      您如何对其进行建模,以便您的其余代码,以及您的应用程序将面临的任何当前和未来的需求,都可以轻松可靠地处理这两件事?对于您的特殊需求,最佳解决方案是什么?

      首先考虑一下,您可能经常会发现您的解决方案类似于众所周知的模式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多