【问题标题】:DDD Dynamic Service InjectionDDD 动态服务注入
【发布时间】:2014-07-03 16:42:02
【问题描述】:

我目前正在构建一个 DDD 应用程序来验证贷款。每笔贷款都有各种验证检查,在批准贷款之前必须执行这些检查。验证检查因贷款而异,大部分需要外部(基础设施)服务才能完成。

鉴于此,我们决定实施这些检查的最佳方式是为每种贷款类型创建一个配置文件,其中将列出特定规则和可以执行规则检查的相应验证器服务。此外,某些规则需要传递特定的参数。例如信用评分检查,会有一个阈值(例如必须超过 600)。为此,我们认为我们应该只传递一个字符串字典对象,称为验证标准。除非有人有更优雅的方式来做到这一点?

现在我的 Loan 实体有一个 validate 方法,它接受要检查的规则列表。我的问题是,在运行时从配置文件中解析服务引用的最佳方法是什么?将服务工厂传递给 Validate() 方法,该方法接受字符串验证器名称?

我在应用程序的其余部分中使用 Unity for DI,但无法找出在运行时动态执行此操作的最佳方法。

任何见解将不胜感激!

【问题讨论】:

  • 您如何确定贷款的类型?每种类型的贷款都是Loan 的子类型,Loan 是否具有枚举类型LoanTypeType 属性,或者您定义了谁的贷款类型?
  • 贷款类型由贷方决定。贷方为批准的贷款制定规则。我们公司是对进来的贷款进行验证的中间人。因此,我们想要一个可以轻松与新贷方合作的系统以及他们要执行的特定规则列表。贷款类型在这里用的确实是错误的术语。抱歉,我只是想简化问题。

标签: c# service dependency-injection domain-driven-design inversion-of-control


【解决方案1】:

我认为验证规则的运行时创建是您领域的重要组成部分。所以我建议从“validate()”方法中提取验证(这对简单的验证规则很有用)并添加到某种“验证规则构建器”中。

这样的类应该是一等公民,才能明确这一概念。它将根据当前上下文(贷款类型、用户类型等)和配置设置动态构建验证器链或类似的东西。验证器链将包括可以很容易地从 DIC 注入的单个验证器对象,并且这些对象也可以很容易地在分离中进行单元测试。

总而言之 - 验证链构建器知道要验证“什么”(需要根据上下文应用哪些单独的验证对象),验证器对象会知道如何验证(需要应用的验证细节)。我想这也是如何划分职责的好方法。

【讨论】:

    猜你喜欢
    • 2014-03-29
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    相关资源
    最近更新 更多