DDD 中的应用程序级别设置?

2023-12-30

只是想了解小组对如何处理实体的配置细节的想法。

我具体想到的是可能由管理员更改的高级设置。您最终可能会存储在应用程序或 web.config 中,但从 DDD 角度来看,应该在对象中的某个位置显式设置。

为了方便讨论,我们以基于 Web 的 CMS 或博客应用程序为例。

给定的博客条目实体具有任意数量的实例设置,例如作者、内容等。

但您可能还希望设置(例如)默认说明或关键字,如果作者未更改这些内容,则站点中的所有条目都应以它们开头。当然,您可以在类中设置这些常量,但站点所有者无法更改默认值。

所以我的想法如下:

1) 使用类级(静态)属性来表示这些设置,然后在应用程序启动时设置它们,可以从数据库或 web.config 进行设置。

or

2)使用单独的实体来保存设置,可能是字典,可以直接使用它,也可以让它成为 Entry 类的成员

你们觉得什么最简单/最灵活?我对第一个的担忧是,它并不让我觉得可插拔(如果我最终想要添加更多功能),因为更改实体的类方法也会让我更改应用程序本身(这感觉像是违反 OCP 规则) )。不过,第二个感觉更重,特别是如果我必须从字典中转换或解析值。


我想说,从领域模型的角度来看,一个值是否可配置并不重要——重要的是它是外部定义的。

假设您有一个必须有名称的类。如果始终需要名称,则无论值的来源如何,都必须将其封装为不变量。这是一个 C# 示例:

public class MyClass
{
    private string name;

    public MyClass(string name)
    {
        if(name == null)
        {
            throw new ArgumentNullException("name");
        }

        this.name = name;
    }

    public string Name
    {
        get { return this.name; }
        set
        {
            if(value == null)
            {
                throw new ArgumentNullException("name");
            }
            this.name = value;
        }
    }
}

像这样的类有效地保护了不变量:名称不能为空。领域模型必须封装这样的不变量,而不考虑哪个消费者将使用它们 - 否则,它们将无法满足柔软设计的目标。

但您询问了默认值。如果您有一个很好的 Name 默认值,那么如何将该默认值传达给 MyClass。

这就是工厂派上用场的地方。您只需将对象的构造与其实现分开即可。无论如何,这通常是一个好主意。选择抽象工厂还是构建器实现并不那么重要,但抽象工厂是一个不错的默认选择。

对于 MyClass,我们可以定义 IMyClassFactory 接口:

public interface IMyClassFactory
{
    MyClass Create();
}

现在您可以定义一个从配置文件中提取名称的实现:

public ConfigurationBasedMyClassFactory : IMyClassFactory
{
    public MyClass Create()
    {
        var name = ConfigurationManager.AppSettings["MyName"];
        return new MyClass(name);
    }
}

确保需要 MyClass 实例的代码使用 IMyClassFactory 来创建它,而不是手动新建它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DDD 中的应用程序级别设置? 的相关文章

  • 应如何聚合公开子实体的信息?

    从这个问题跟进实体是否应该有方法 如果有 如何防止它们在聚合之外被调用 https stackoverflow com questions 51907447 should entity have methods and if so how
  • ASP.NET MVC Web 应用程序中视图逻辑和域逻辑之间的混淆

    我对域 应用程序逻辑和用户界面逻辑感到困惑 为了说明我想要确定的内容 我将在下面描述一个虚构的程序以供说明 1 想象一个带有一组 3 个级联下拉菜单的小型应用程序 当您选择一个下拉列表时 它会触发 jQuery Ajax GET 最终到达
  • 强制聚合之间不变量的最佳方法?

    处理聚合之间一致性的最佳方法是什么 以 Vaughn Vernon 书中的示例为例 您有 BacklogItem 聚合和 SprintAggregate 当 BacklogItemEvent 引发时 事件处理程序会捕获它并尝试更新 Spri
  • 值对象应该保存对实体的引用吗?

    值对象是否应该引用 DDD 方法中的实体 EDIT Dmitry 这大概就是我的情况 这里我附上类图 其中Account保留对集合的引用IInvoiceable项目 我治疗与Tenant作为实体 但它只拥有 1 个帐户 我不认为Accoun
  • 具有行为和 ORM 的丰富域模型

    观看 Jimmy Bogard 的 NDC12 演示 Crafting Wicked Domain Models 后 http ndcoslo oktaset com Agenda http ndcoslo oktaset com Agen
  • 如何在领域层使用工作单元

    我正在尝试在 我的服务 类中使用工作单元模式 我有我的 CompanyService 课程 public class CompanyService ICompanyService private readonly ICompanyRepos
  • Javascript 域模型对象约定

    如果我必须在 C 中创建域模型对象 我可能会这样做 public class Person Public string Name get set Public string Gender get set Public int Age get
  • 首先是 DDD 数据库。如何处理聚合

    我正在尝试学习 DDD 的概念 我做了一个项目 我使用数据库优先方法 在基础设施中 我添加了一个 edmx 文件 我选择自动生成实体 现在在 域 中我正在尝试创建聚合 但在这里我遇到了一些问题 我正在尝试创建一个名为 User 的聚合 但
  • 涵盖 .NET 中的 TDD、DDD 和设计模式的书籍

    我想要一本能够真正让我全面了解使用 C TDD ASP NET MVC DDD 和设计模式 例如存储库模式 的现代 ASP NET 开发的书 我非常擅长 C 和 ASP NET MVC 但想填补空白 如果您对涵盖这些主题的一两本书有很好的体
  • 实体框架:获取存储库中的子类对象

    我有与下面列出的数据库表对应的以下模型 经理就是雇员 会计师也是雇员 让所有管理器都进入存储库的最佳方法是什么 如何实现GetAllManagers 方法 这是正确的TPT吗 CODE MyRepository MyEmployeeRepo
  • 有界上下文、子域和通用语言

    a 对于包含两个或多个子域的 BC 存在概念重叠的可能性 甚至更糟糕的是 相同的概念 由其中几个子域使用 可能会被每个子域以不同的方式解释 理解 无论如何 如果 BC 确实包含许多子域 它是否应该提供几种通用语言 每个子域一种 或者所有子域
  • 再次将服务注入域对象

    我有一个对地理数据进行操作的特定域 我正在 TypeScript 和 NodeJS 中实现这个项目 并有以下类 Point 包含纬度和经度的值对象 Area 包含点集作为形状定义的值对象 Sector 实体 它不是持久的 但它是可变的 包含
  • 为什么实体框架需要 ICollection 来延迟加载?

    我想编写一个丰富的域类 例如 public class Product public IEnumerable
  • 除了“真实”对象之外,DDD 存储库还可以使用摘要对象吗?

    假设我正在创建一个存储库来存储数字电子书 如下面的界面所示 该存储库将存储书籍的实际文本以及标识书籍的元数据 标题 作者 出版商 ISBN 等 public interface IBookRepository void AddBook Bo
  • DDD 聚合和值对象

    我想问一下关于DDD功能的问题 假设我们有两个聚合 每个聚合都包含值对象地址 根据 Eric Evans DDD 我们应该将聚合彼此隔离 因此第一个聚合的聚合根不能有指向 Address 的链接 坦白说 这对我来说似乎没有意义 所以问题是如
  • 如何在 CQRS 中处理基于集合的一致性验证?

    我有一个相当简单的域模型 涉及一系列Facility聚合根 鉴于我使用 CQRS 和事件总线来处理从域引发的事件 您如何处理集合的验证 例如 假设我有以下需求 Facility必须有一个唯一的名称 由于我在查询端使用最终一致的数据库 因此在
  • 领域模型可以知道存储库吗?

    可能对于某些域逻辑实现实体需要访问存储库以更新 删除自身或任何相关实体 这听起来对吗 不 不是 至少对于标有 的问题 领域驱动设计 标签 当然 Active Record 模式有权在某些系统中生存 并且有些人发现强耦合很有用 但在 DDD
  • DDD:持久聚合

    让我们考虑一下典型的Order and 订单项目例子 假如说订单项目是的一部分Order聚合 只能通过订单添加 所以 要添加一个新的订单项目 to an Order 我们必须通过存储库加载整个聚合 将新项目添加到Order对象并再次保留整个
  • 身份验证和用户任务

    我正在考虑开发一个具有明确定义域的系统 主要基于网络 域的一部分包括像这样的实体Diary Booking Customer etc 不过我创建了另一个名为User其目的仅用于身份验证和授权 污染Customer具有特定于身份验证的数据的实
  • 对聚合根内实体的操作

    如果我设计了如下所示的 AR 您认为我应该如何更新订单行对象之一中的属性 例如 我如何更改订单行之一的标题 示例问题 这是订单聚合根 public class Order private readonly int id private re

随机推荐