【问题标题】:how to handle this circular dependency?如何处理这种循环依赖?
【发布时间】:2018-10-05 01:31:47
【问题描述】:

我有一个 MyApp 解决方案。此解决方案有一个服务项目和一个存储库 (DAL) 项目。应用程序模式是每个服务调用一个相应的存储库进行数据访问。

Services 项目有一个 LoggingService,我想使用 LoggingService 从其中一个存储库中记录一些信息。但是,我无法在 Repositories 项目 b/c 中添加对 Services 项目的引用,这会导致循环依赖。

一种解决方法是让我直接调用 LoggingRepository 而不是调用服务。有没有更好的方法来处理这种循环依赖?

【问题讨论】:

  • 你能发布一些存根代码来帮助澄清你的情况吗?我认为可以反转依赖关系,因此每个存储库都有一个在需要时使用的服务,但如果没有一些示例代码,我无法判断这是否可以工作

标签: c# .net architecture


【解决方案1】:

当然,他们有很多方法可以处理这种情况,首先我会为每个服务创建一个接口并将其放在单独的 dll 中,例如,您将有两个用于日志服务的项目,如下所示:

  • 日志记录服务
  • 日志服务 我也会对每一个 boundedContext 执行此操作,它们代表一组处理我领域内单个方面的项目(例如,学生在学校应用程序中的操作和逻辑,搜索领域驱动设计模式以获取更多信息)如下:

  • IStudentsDomain

  • StudentsDomain

让我们想象一下,我们有其他存储库和称为 Teachers 的有界上下文,在以下项目中表示如下:

  • ITeachersDomain
  • 教师领域

现在您只在 StudentsDomain 和 TeachersDomain (DAL 实现或域层)中引用 ILoggingService,并使用依赖注入(基于您的 asp.net mvc 项目我会推荐 Unity,在 asp.net core mvc 中的 DI已经存在开箱即用,最后你也可以在 WPF 中使用 unity)以便将你的接口注册到它们的实现中,然后在 StudentsDomain 和 TeachersDomain 的构造函数中请求它们,如下所示:

public class TeachersDomain : ITeachersDomain
{
    public ILoggingService LoggingService { get; set; }
    public TeachersDomain(ILoggingService loggingService)
    {
        LoggingService = loggingService;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 2015-01-04
    • 2014-07-29
    相关资源
    最近更新 更多