【问题标题】:Circular reference issues in C# webAPi projectsC# webAPI 项目中的循环引用问题
【发布时间】:2016-11-24 10:09:50
【问题描述】:

我有一个 C# web api 项目,其架构如下图所示 (ProjectA)

在上图中,项目 A 中的控制器使用项目 A 的服务来完成实际工作,而服务使用存储库来读取和写入数据库。 它们都使用 Autofac 依赖注入。 例子: 使用各种服务的Controller的构造函数

 public DKMenuController(ITokenService tokenService, IUserService userservice, IDKMenuService dkMenuService)
    {
        _tokenService = tokenService;
        _dkMenuService = dkMenuService;
        _userservice = userservice;
    }

使用底层存储库与数据库通信的服务构造函数

 public DKMenuService(IRepository repository)
    {
        this._repository = repository;
    }

Application启动时注册各种服务如下

    this.RegisterType<Repository>().As<IRepository>().InstancePerRequest();
 this.RegisterType<DKMenuService>().As<IDKMenuService>().InstancePerRequest();

现在我想添加另一个项目(在示例 ProjectB 中命名),它只是一个类库,将从 ProjectA 服务调用,将做一些事情,然后将使用 ProjectA 的存储库模式并将数据保存在 DB 中。 问题是这种设计会导致循环引用,并且 2 个项目无法编译。 这里有一个类似的问题How to solve circular reference? 但答案是否正确尚不清楚。 有什么想法吗?

【问题讨论】:

  • 图表中没有循环依赖。你能澄清一下循环依赖在哪里吗?
  • @Enigmativity - 查看标题,2 个 项目(列)确实有一个圆圈。
  • @HenkHolterman - 什么标题?图中没有圆圈。这是一个有向无环图。

标签: c# reference circular-reference


【解决方案1】:

这可能是一些工作,但解决方法是将 Repository 移动到新的 ProjectRepo

然后有ProjectAProjectB都引用ProjectRepo,然后ProjectA也可以引用ProjectB而不需要B。

【讨论】:

  • 这应该不需要任何redesign。只需在实现中进行一些调整和重构。
【解决方案2】:

据我所知,您在此处显示的内容不是循环引用。您不能按照图表上的箭头画一个圆圈。

如果存储库类在 Project A Services 上,那么您有一个循环引用,但这不是问题。如果是这种情况,请记住这一点,将存储库移到项目 A 之外。

【讨论】:

  • 在类级别没有什么是循环的,但在项目/程序集级别它会是?
  • 我同意 Peter B. 在项目/装配级别存在循环引用。假设项目A中存在一个ServiceA。这个服务A启动了一个Service B的新对象。ServiceB做了一些事情,然后调用项目的A存储库以保存在DB中。如果您尝试构建项目 B,它将失败,因为它需要来自项目 A 的二进制文件作为存储库类。如果您尝试先构建 Project A,它将失败,因为它需要 Project 的 B ServiceB 类
  • @ChristophAdamakis - 项目 A 没有存储库。我没有看到一个循环。
  • 存储库在 ProjectA 中。再次查看我的图表
  • @ChristophAdamakis - 项目 A 似乎引用了存储库。这与项目 A 中的存储库不同。
猜你喜欢
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 2020-09-06
相关资源
最近更新 更多