如何根据当前项目构建调用另一个依赖项函数的依赖项?

How to build a dependency that calls a function of another dependency depending on the current project?

解释: 我有一个巨大的项目,它建立在一个坚实的框架之上,其中必须连接到数据库的函数根据一些条件以不同的方式工作(简单来说,我们可以说它是一个 true/false 布尔值)。简单来说,当它访问数据库时,它要么作为 Web 服务访问,要么作为直接 mysql 连接访问。

现在我开始创建一个Xamarin项目(android),我想导入这个框架,但是Xamarin不支持mysql...虽然框架可以调用到网络服务以获取 mysql 数据,mysql 代码存在的事实阻止了我的 xamarin 项目的构建。我什至不能使用“#if”,因为仍然有对 mysql dll 的引用。我将如何拆分我的 class dll 文件,以便此 android 项目不加载 mysql dll,只是调用 Web 服务的函数的一部分? 该函数的外观示例:

public static void InsertStuff(object stuff, bool useDirectMysql)
{
    if (useDirectMysql)//I would like that this part only appears/works if its not the xamarin project, however, i can't use #if as the framework dll still has a reference to the mysql dll
    {
        //MySqlConnection connection = new MySqlConnection....
        //insert stuff
    }
    else
    {
        //Insert stuff with a web service function.. (compatible with xamarin)
    }
}

实现平台特定功能的模式如下:

  • 在您的共享项目中创建一个具有 InsertStuff 方法的接口。

  • 使用 DI 注入依赖项。

  • 相应地在每个平台项目中实现接口。

Zdravko 提供了一个很好的解决方案

但是,我完成了我想要的,通过逐字地编译器注释框架中属性、函数、对象和引用 ("using ...") 的每一次使用或引用。所以虽然它在项目的引用部分引用了.dll文件,但Visual Studio似乎没有compile/emb那些没有使用的dll。

我的最终解决方案是:

1-创建 2 个构建配置,一个用于 xamarin 项目和框架,另一个用于我的普通 windows 程序和框架。

2-评论与 mobile xamarin 不兼容的所有内容(但仍保留对项目的引用)

3-创建了一个编译器变量,如 A。当我想编译我的 xamarin 项目时,我 select 只允许框架和 xamarin 的构建配置,将 A 放在我的框架 dll 中并编译。

4-在构建普通的 c#/c++/etc 程序时更改配置并远程 A

一切都在同一个 VS 解决方案上。