首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于领域驱动设计的C#知识认证

基于领域驱动设计的C#知识认证
EN

Code Review用户
提问于 2019-04-02 15:19:10
回答 1查看 2.7K关注 0票数 15

作为我们建立的保险索赔系统的一部分,索赔管理人员可以记录与索赔有关的来电。

索赔管理器必须通过询问许多“数据保护”问题来验证调用方,这些问题是根据数据库中针对索赔的信息动态生成的。我相信这种类型的安全性被称为“基于知识的身份验证”。

关于数据保护问题的Notes:

  • 有些问题是强制性的,有些则不是。
  • 为了验证调用者,必须回答所有强制性问题。
  • 至少必须回答一个非强制性问题才能验证调用方。
  • 额外的非强制性问题可能仍未得到解答。
  • 每个问题可能有多个正确的答案。

下面是添加调用视图的数据保护部分的屏幕前后截图:

当前的系统是五年前编写的,我们没有尝试使用任何设计模式或现代方法(比如领域驱动的设计),因为我们缺乏时间和理解。

我们现在有机会重写这个软件,并希望遵循域驱动的方法。

一个First实体类的DataProtectionQuestion草案:

代码语言:javascript
复制
public class DataProtectionQuestion
{
    public string Question { get; set; }
    public IEnumerable Answers { get; set; }        
    public bool IsRequired { get; set; }
    public string Answer { get; set; }
    public bool IsAnswered => !string.IsNullOrWhiteSpace(Answer);
    public bool AnswerIsCorrect => Answers?.Contains(Answer) ?? false;
}

产生于此设计的Questions:

  • 这是贫血模型吗?
  • DataProtectionQuestion实体是验证答案的“正确”位置吗?
  • 实体应该有像'SetAnswer‘或'SetAnswerIsValid’这样的方法吗?
  • 设置者是否应该是私有的,客户端是否应该通过构造函数提供数据?
  • 答案是否应该是具有“IsValid”属性的实体?
  • 如何在UI中显示答案以包括“未回答”和“不正确答案”?(我意识到UI不是领域关注的问题,而是有能力选择这些问题作为答案)

Second草案(试图回答上述一些问题):

代码语言:javascript
复制
public class DataProtectionAnswer
{    
    public DataProtectionAnswer(string answer, bool isValid)
    {
        Answer = answer;
        IsValid = isValid;
    }
    public string Answer { get; private set; }
    public bool IsValid { get; private set; }
}

public class DataProtectionQuestion
{
    public DataProtectionQuestion(string question, bool isRequired, IEnumerable answers)
    {
        // validate non-null parameters?
        Question = question;
        IsRequired = isRequired;
        Answers = answers;
    }
    public string Question { get; private set; }
    public bool IsRequired { get; private set; }
    public IEnumerable Answers { get; private set; }
    public DataProtectionAnswer SelectedAnswer { get; private set; }
    public bool IsAnswered => SelectedAnswer != null;
    public bool AnswerIsCorrect => SelectedAnswer?.IsValid ?? false;
    public void SetSelectedAnswer(DataProtectionAnswer answer)
    {
        // Should validate that answer is not null and contained in Answers?
        SelectedAnswer = answer;
    }
}

关于更多问题的Some answers..leading?:

  • 问:实体应该有“SetAnswer”或“SetAnswerIsValid”之类的方法吗?
  • 答:我添加了一个“SetSelectedAnswer”方法,但我仍然不知道这是否“感觉”对吗?
  • 设置者是否应该是私有的,客户端是否应该通过构造函数提供数据?
  • 我不知道,但这就是我在草稿2中所做的。
  • 答:答案是否应该是一个拥有“IsValid”属性的实体?
  • 答:根据前面的问题,这是我所做的,但我应该这样做吗?
  • 如何在UI中显示答案以包括“未回答”和“不正确答案”?
  • 答:我现在可以通过在DataProtectionAnswer中添加一个“未回答”和“不正确的答案”来做到这一点,但这“感觉”是错误的。这不是推荐人的责任吗?

正如您可能知道的那样,我正在挣扎,并且真的很难理解如何使用DDD方法来建模这个场景。也许DDD不适合这种情况。我不知道,我现在觉得很蠢!

有谁能就前进的方向/更好的方法提供一些指导/建议?

EN

回答 1

Code Review用户

回答已采纳

发布于 2019-04-02 16:19:54

票数 19
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/216727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档