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

时间:2019-05-23 21:15:29

标签: dependency-injection .net-core entity-framework-core domain-driven-design

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

我无法确定将服务注入到实体中的方式或方法是否正确/最佳,以便在运行业务规则时可以把握这些日期。我确实发现this answer似乎演示了一种实现方法,但是我想看看是否还有其他选择,因为这种方法乍一看对我来说有点代码气味(向DbContext抢占私有构造函数注入的上下文。

还有其他方法可以完成这样的事情吗?

1 个答案:

答案 0 :(得分:1)

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

您不应将任何服务或存储库注入聚合中。聚合应专注于解决方案的命令/事务侧,并使用预加载状态,并且应避免通过任何手动机制请求其他状态。应该获取状态并将其移交给汇总。

在您的特定情况下,建议您加载BusinessCalendar,然后在执行某些功能时将其交给您的集合,例如:

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
    }
}

另一种解决方法是让您的域忽略此位并将负担加在调用代码上。这样,如果您要求您的网域执行某项操作,那么它会这样做,因为在某些情况下,可能会在非工作日(在我的琐碎示例中)进行注册。在这些情况下,应用程序层负责检查日历中的“正常”注册或在某些情况下覆盖默认行为。这与授权所采用的方法相同。应用层负责授权,而域不应该在意。如果您可以调用域代码,则表示您已被授权这样做。