是否可以在 PER-FILE/project-item 基础上定义编译器常量?
背景:
我想实现一个数据库抽象层 (DAL),它将所有读取和写入任务分开,但保留一个可以同时执行这两项任务的 DAL,但无需多次实现相同的方法(抽象类意味着每个实例都有 1 个实例类)支持的数据库类型)。
所以我想像这样分开我的 DAL:
abstract class ReadDAL
abstract class WriteDAL
abstract class ReadWriteDAL (multiple-inheritance from Read&Write-DAL).
不幸的是,这不起作用,因为 C# 不支持多重继承。
因此,解决此问题的一种方法是定义接口(interface):
abstract class ReadDAL : IReadDAL
abstract class WriteDAL : IWriteDAL
abstract class ReadWriteDAL : IReadDAL, IWriteDAL
但是,如果我这样做,我将不得不在每次更改 DAL 中的一个方法时更改接口(interface)定义,并更改 ReadWriteDAL 中定义的方法,并且我必须将方法实现复制粘贴到某处,这意味着将会有一个 DRY 不合规困惑。
我想我可以做的是第二次添加相同的文件作为链接,并在每个项目的基础上定义:
#if SOMECONSTANT // true if file is PartialReadDAL.cs
public partial abstract class ReadDAL
#else // false if "file" is link called "PartialReadWriteDAL.cs" symlinking to PartialReadDAL.cs
public partial abstract class ReadWriteDAL
#endif
and here some implementation.
但是我可以以某种方式为每个文件定义一个编译器常量吗?
或者以某种方式达到类似的效果?
最佳答案
符号链接(symbolic link)路线会非常非常困惑。当被迫这样做时,我会通过在相关文件中添加一些 #define
作为预构建步骤来实现。然后我会在代码中存在这些符号时使用 #if
。不过,我根本不喜欢这样:我的猜测是,即使我在构建结束后清除了这些标记,这也不会像我希望的那样透明,因此它不会进入版本控制。ReadWriteDAL
是要包含它自己的一些状态,还是只是一个调度器,用于调用 ReadDAL
和 WriteDAL
的方法?如果它只是一个调度程序,您可能会考虑放弃实际实现( ReadWriteDAL
)并使用 dynamic proxy mechanism 将调用传递到组合根中注册的 IReadDAL
和 IWriteDAL
。我为温莎城堡写了 a tool like that。
关于基于 PER-FILE 的 C# 编译器常量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41067527/