C# 分离接口和实现

C# 分离接口和实现,c#,design-patterns,C#,Design Patterns,假设我有一个项目a,它引用了项目B。B中定义了一些类,a有一个接口ISomething,它的实现位于a中,并使用B的类。然后我想创建C项目和A接口的另一个实现,它使用C的类。问题是:我想将这个接口的实现移动到相应的项目中,这样我就可以定义我想在构建脚本中使用的项目,而忽略其他项目。尽管如此,我还是希望保存接口和它的实现之间的连接,因为已经存在大量使用该接口的代码。到目前为止,我一直在考虑以下选项: 在项目A中使用适配器模式,它返回ISomething,引用两个实现,并在缺少C时调整B的实现,反

假设我有一个项目a,它引用了项目B。B中定义了一些类,a有一个接口ISomething,它的实现位于a中,并使用B的类。然后我想创建C项目和A接口的另一个实现,它使用C的类。问题是:我想将这个接口的实现移动到相应的项目中,这样我就可以定义我想在构建脚本中使用的项目,而忽略其他项目。尽管如此,我还是希望保存接口和它的实现之间的连接,因为已经存在大量使用该接口的代码。到目前为止,我一直在考虑以下选项:

  • 在项目A中使用适配器模式,它返回ISomething,引用两个实现,并在缺少C时调整B的实现,反之亦然。缺点是,在我看来,所有接口实现关系都是无用的
  • 创建项目D,它包含接口,并由A、B和C引用,然后在此项目中将接口解析为它的一个实现。项目接收具体实例并使用它。缺点是我需要创建另一个库并污染存储库

还有什么更好的选择吗?

我肯定会选择D项目

有时你会在解决方案中看到,接口甚至没有被共享,或者本来是要被共享的,这显然有些过分,但我想说,对于你的情况来说,这是最好的方法

现在,您可能不想将其作为dll或项目引用,因为

  • 你将不得不编译和链接这个项目,这将需要时间。即使该项目中几乎没有代码,链接时间仍然会发生
  • 您将无法轻松地对界面进行版本设置,因此,在一个项目中编辑界面时,需要立即在其他项目中进行传播,并且您将不知道是否已经完成了编辑

  • 为了避免这两个问题,我将从这个项目D中创建一个NuGet包。您不需要在NuGet.org上托管它,您可以使用内部部署服务器或最简单的方法(通过指向本地或共享文件夹)自行托管它。

    出于某种原因,您需要在单独的项目中保留实现吗?i、 e.不希望该代码存在于某些构建中?我的主要项目针对多个平台,我使用脚本根据运行该脚本的参数生成特定的解决方案文件。我想要的是定义一个新的参数,它将指定我想要在解决方案(B或C)中使用的项目,这就是为什么我想要在单独的项目中移动实现