Dependency injection 如何通过实体内的注入服务访问查找数据?

Dependency injection 如何通过实体内的注入服务访问查找数据?,dependency-injection,.net-core,entity-framework-core,domain-driven-design,Dependency Injection,.net Core,Entity Framework Core,Domain Driven Design,我的应用程序是使用DDD与.NET核心和EF核心。我有一些在实体中运行的业务规则,这些规则需要根据公司假日日期的缓存列表检查日期。公司假日从数据库加载,并由一个应用程序服务缓存,该应用程序服务配置有我们的DI容器,以便可以将其注入到我们的控制器中,等等 我无法确定如何或是否是正确/最佳的方法,将服务注入实体中,以便在运行业务规则时获取这些日期。我确实发现这似乎演示了一种方法,但我想看看是否有其他选项,因为这种方法乍一看有点代码味道(向DbContext添加属性以获取私有构造函数注入的上下文) 有

我的应用程序是使用DDD与.NET核心和EF核心。我有一些在实体中运行的业务规则,这些规则需要根据公司假日日期的缓存列表检查日期。公司假日从数据库加载,并由一个应用程序服务缓存,该应用程序服务配置有我们的DI容器,以便可以将其注入到我们的控制器中,等等

我无法确定如何或是否是正确/最佳的方法,将服务注入实体中,以便在运行业务规则时获取这些日期。我确实发现这似乎演示了一种方法,但我想看看是否有其他选项,因为这种方法乍一看有点代码味道(向DbContext添加属性以获取私有构造函数注入的上下文)


有没有其他方法可以完成类似的任务?

ORM类很少是您的域对象。如果您可以从您的域开始,无缝地映射到ORM,而不需要特定于基础结构的更改或属性,那么这很好;否则,您需要从ORM对象中拆分域对象

您不应该将任何服务或存储库注入到聚合中。聚合应关注解决方案的命令/事务方面,并使用预加载状态,并且应避免通过任何手动机制请求附加状态。应获得状态并将其交给骨料

在您的特定场景中,我建议加载您的
业务日历
,然后在执行某些功能时将其交给您的聚合,例如:

public class TheAggregate
{
    public bool AttemptRegistration(BusinessCalendar calendar)
    {
        if (!calendar.IsWorkingDay(DateTime.Now))
        {
            return false;
        }

        // ... registration code

        return true;
    }

    // or perhaps...

    public void Register(DateTime registrationDate, BusinessCalendar calendar)
    {
        if (!calendar.IsWorkingDay(registrationDate))
        {
            throw new InvalidOperationException();
        }

        // ... registration code
    }
}
另一种做法是让您的域忽略这一点,并将负担放在调用代码上。通过这种方式,如果您要求域执行某些操作,它将这样做,因为在某些情况下,可能会在非工作日(在我的小示例中)执行注册。在这些情况下,应用层负责检查日历的“正常”注册或在某些情况下覆盖默认行为。这与授权所采用的方法相同。应用层负责授权,域不应该关心这一点。如果您可以调用域代码,则您已被授权这样做