C# 业务层中数据层依赖关系的控制反转和注入

C# 业务层中数据层依赖关系的控制反转和注入,c#,dependency-injection,inversion-of-control,solid-principles,business-logic-layer,C#,Dependency Injection,Inversion Of Control,Solid Principles,Business Logic Layer,我们正在.net/c中设计一个分层的业务应用程序,并尽可能地遵循坚实的原则。可测试性在我们的项目中非常重要,为此我们使用Moq。使用moq,我们正在模仿我们的实体框架上下文 由于我们测试的主要目标是主业务层(BL)逻辑,业务层类可以注入数据访问层(DAL)上下文来使用。见下面的例子。 负责加载数据的BL类的示例构造函数。此类为设置访问等注入依赖项 public LoadDataProcess(KonstruktEntities context, IDataLoadedChecker da

我们正在.net/c中设计一个分层的业务应用程序,并尽可能地遵循坚实的原则。可测试性在我们的项目中非常重要,为此我们使用Moq。使用moq,我们正在模仿我们的实体框架上下文

由于我们测试的主要目标是主业务层(BL)逻辑,业务层类可以注入数据访问层(DAL)上下文来使用。见下面的例子。 负责加载数据的BL类的示例构造函数。此类为设置访问等注入依赖项

    public LoadDataProcess(KonstruktEntities context, IDataLoadedChecker dataLoadedChecker, ILoadUserBudgetData dataLoader, ISetLineAccess setBudgetLineStatus, ILineAccessFilterHandler budgetDataLineStatusFilterHandler) 
    {
        _context = context;
        _dataLoadedchecker = dataLoadedChecker;
        _dataLoader = dataLoader;
        _setBudgetLineStatus = setBudgetLineStatus;
        _budgetDataLineStatusFilterHandler = budgetDataLineStatusFilterHandler;
    }
现在,还有其他DAL依赖项可以注入到我们的BL类中。由于这些对象是在服务层(WCF)中实例化的,我不喜欢DAL组件可以被注入


问题是,我们是否应该将DAL依赖注入BL类

因为你的BL依赖于抽象,所以你的BL遵循依赖倒置原则(DIP)。很明显,您的业务层需要与DAL进行通信;确实没有办法解决这个问题,但由于您依赖的是抽象,而不是低级组件,所以这将很好。

如果您试图将SOLID应用于业务层,请查看并阅读本文,因为它们可以在应用程序的可维护性和灵活性方面产生巨大的差异。我们将看看这些,谢谢。你对我问的问题有什么看法?好吧,为了进一步获得DIP奖牌,你认为有理由以任何方式包装“KonstruktEntities”类吗?它继承自DbContext,这是我看到的一个IObjectContextAdapter问题,例如,当我的服务层中的WCF函数需要直接注入DAL依赖项时。我觉得我不应该在服务层实例化任何DAL对象,但也许必须这样做@JohanLarsson:您的所有组件都应该在您的中实例化,而不是在其他地方。让您的代码依赖于
DbContext
始终是违反DIP的,但这是您无法始终防止的。你必须在某个地方查询数据库。是的,我知道很难做到完全可靠。我的合成根位于服务层,它使用一个IoC容器,所以我想我做的事情“足够好”。谢谢你的意见。最后一个问题,我是否应该实例化一次上下文并将相同的上下文注入所有依赖类?这样,相同的上下文对象就可以在整个系统中重用graph@JohanLarsson当前位置不可能100%遵守可靠的原则。在有意义的地方应用它们。关于注入DbContext,请阅读。