【问题标题】:Implement same interface in different projects在不同的项目中实现相同的接口
【发布时间】:2018-08-24 20:01:22
【问题描述】:

我有一个 API 项目和一个包含接口的类库项目。所以我有第三个实现接口的项目和一个实现与项目3相同接口的项目。因此,项目3和4知道项目2。

我的问题是我想通过我的类库项目(第二个)调用实现,但是这个项目不知道实现项目。

如何通过我的第二个项目调用实施项目?

想法是我有很多实现项目,所以我只想创建另一个新项目并实现接口,而不必对项目2中的代码进行太多更改。

我在所有项目中都使用 .NET Core 2.0

【问题讨论】:

  • 你做错了什么。具有抽象的程序集永远不应该关心实现
  • 不太确定,但您是否正在寻找像 Ninject 这样的依赖注入?
  • @maccettura 我的第二个项目需要知道所有实现接口的项目吗?
  • @Alberto 包含抽象的程序集应该可以被实现这些接口的程序集访问,但反之则不行。即使您愿意,您也无法这样做,因为这是“循环依赖”。我们需要更多细节和具体示例才能提出替代方法
  • @Alberto 你需要阅读依赖注入和 IOC 容器。您的 Web API 程序集应该引用抽象程序集实现程序集。 Web API 项目是您将使用 IOC 容器将具体实现映射到抽象的地方

标签: c# asp.net-core .net-core


【解决方案1】:

这是一个经典的“插件”系统。

在项目 2(“托管”项目)中定义接口

3 和 4 参考 2 以获取接口定义(也经典地获取托管项目提供的服务)

现在你需要让宿主 (2) 动态加载插件。

您可以“手动”完成此操作。 = 枚举 DLLs 是一个特定的目录并找到实现接口的那些。

或者你可以使用各种框架来做到这一点。 MEF 是众所周知的。在这里查看更多信息Implementing Plugin Architecture - Dynamic DLL loading

【讨论】:

  • 我认为这根本不是正确的方法。 OP 只需要加强他们的依赖注入能力并选择一个 IOC 容器。
  • 如果 OP 同时需要 3 个和 4 个活动,那么 IOC 通常不是正确的方法。
【解决方案2】:

如果不知道自己想要完成什么,就很难确切知道自己应该做什么,但是...

创建一个项目,将其命名为 2.a,其中仅包含接口。假设项目 2 使用了 3 和 4 中的实现,则取出了 2.a、3 和 4 的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多