加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 域驱动设计:在不使用服务定位器的情况下从实体访问配置的

发布时间:2020-12-15 08:07:04 所属栏目:百科 来源:网络整理
导读:我有一个User实体,它具有HasCompletedSecurity属性,该属性指示该特定用户是否已回答系统所需的安全问题的数量.系统所需的安全问题数量是可配置的,并从配置文件中检索. User类应该如何访问配置的信息? 我目前有一个IConfigurationService接口,我有一些实现,
我有一个User实体,它具有HasCompletedSecurity属性,该属性指示该特定用户是否已回答系统所需的安全问题的数量.系统所需的安全问题数量是可配置的,并从配置文件中检索. User类应该如何访问配置的信息?

我目前有一个IConfigurationService接口,我有一些实现,它使用ConfigurationManager或Azure等效项(如果可用).我通过静态的InjectionService类封装了对我的DI容器的访问,并且我正在解析配置的值,如下所示:

public class User
{
    private static readonly IConfigurationService _configurationService = 
        InjectionService.Resolve<IConfigurationService>();

    public bool HasCompletedSecurity
    {
        get
        {
            // Uses the static _configurationService to get the 
            // configured value:
            int numberOfRequiredResponses = 
                GetConfiguredNumberOfRequiredResponses();

            return this.SecurityQuestionResponses.Count()
                >=
                GetConfiguredNumberOfRequiredResponses();
        }
    }
}

这当然是ServiceLocator anti-pattern的一个例子,我不喜欢它.静态依赖使单元测试任何使用此类的东西都很笨拙.

我正在使用Entity Framework并从here开始提示我不想通过DI容器传递我的实体来为它们提供依赖关系,所以……我应该如何访问配置的值呢?

编辑:将这个确切的示例放在一边(我确实感谢关于它的正确架构的建议),我感兴趣的更大的问题是如何管理来自实体的服务的非静态引用?答案只是以你永远不需要的方式构建实体吗?

解决方法

这是我如何定义User类:
public class User
{
    public bool HasCompletedSecurity { get; set; }

    // other members...
}

说真的,这是一个更好的解决方案,因为它将时间维度上的值分离.考虑一下:如果用户在2010年完成了所有安全问题,并且您稍后更改了业务规则,那么您是否会使现有用户无效?

在大多数情况下,在过去的某个时间记录和持久可能更合理,用户完成了当时生效的安全程序.这样,您就不会打扰现有用户.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读