【问题标题】:How to expose a class to an external Project without Reference in c#如何在c#中将类公开给外部项目而无需引用
【发布时间】:2016-12-06 05:41:30
【问题描述】:

我有 3 个项目,分别称为 A、B、C。

在项目 A 中,我有一个名为“Car”的类。

在项目 B 中,我参考了 A,在项目 B 中,我创建了“汽车”列表。

项目 C 引用了 B。

我想从项目 B 中获取列表到项目 C 中并对其进行操作。

问题:

在项目 CI 中不允许引用项目 A,其中类“Car”,因此项目 C 不知道“Car”类,我无法执行下一个命令:

List<Car> cars = B.GetCars();

感谢您的帮助!

【问题讨论】:

  • 如果项目 C 不能引用 Car 的项目,则不能返回 Car。您要么必须添加此引用,要么在项目 B 中创建一个映射器类
  • 问题是是否有任何其他方法可以在不参考 A 且不使用映射器类的情况下做到这一点。 B 可以向 C 公开“汽车”类吗?
  • 嗯...请您解释一下为什么C 不能引用A?你几乎需要一个,那么究竟是什么阻止了你,因为这与答案密切相关。
  • 另外,您真的需要能够访问C 中的Car 的成员吗?如果没有,您可以将其声明为List&lt;object&gt;...
  • 如果可以,请将 A 拆分为 A1 和 A2,其中 A1 定义“汽车”,A2(引用 A1)定义您想要对 C 隐藏的所有内容。然后您只需在 C 中引用 A1。

标签: c# .net


【解决方案1】:

解决方案思路

我会为此使用一个接口层(称为 Project I)。

此项目I 包含接口ICar

其他项目ABC 参考I

你的 Car 类应该实现这个接口,看起来像这样:

public class Car : ICar
{
    // ... some great Code
}

B 项目中,您的功能是:

public List<ICar> GetCars()
{
   var myCars = new List<Car>();

   // ... some really special magic

   return (List<ICar>)myCars;
}

现在你的代码,在C项目中可以像这样使用这个函数:

List<ICar> cars = B.GetCars();

为什么要使用接口层?

因为这样您的代码将获得更多可操作性。这非常适合使用依赖注入单元测试。它将帮助您在某些情况下替换部分实现,例如在单元测试期间提供 Mock 对象


设计方法

为了防止spaghetti code,我建议查阅 Jeffery Palermo 的 Onion Architecture 概念。

在 SO 上有一些很棒的问题:

【讨论】:

  • 你能解释一下为什么接口层在这里最合适吗?
猜你喜欢
  • 1970-01-01
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 2017-05-30
  • 1970-01-01
相关资源
最近更新 更多