4

是否可以在 PER-FILE/project-item 基础上定义编译器常量?

背景:我想实现一个数据库抽象层(DAL),它将所有读取和写入任务分开,但保留一个可以同时执行这两个任务的 DAL,但无需多次实现相同的方法(抽象类意味着将有 1 个实例类对于每种支持的数据库类型)。

所以我想像这样分离我的 DAL:

abstract class ReadDAL
abstract class WriteDAL
abstract class ReadWriteDAL (multiple-inheritance from Read&Write-DAL).

不幸的是,这不起作用,因为 C# 不支持多重继承。

所以解决这个问题的一种方法是定义接口:

abstract class ReadDAL : IReadDAL
abstract class WriteDAL : IWriteDAL
abstract class ReadWriteDAL : IReadDAL, IWriteDAL

但是,如果这样做,每次更改其中一个 DAL 中的方法时都必须更改接口定义,并更改 ReadWriteDAL 中定义的方法,并且必须将方法实现复制粘贴到某处,这意味着会有一个 DRY-non-compliance 混乱。

我想我可以做的是第二次添加相同的文件作为链接,并在每个项目项的基础上进行定义:

#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. 

但是我可以以某种方式为每个文件定义一个编译器常量吗?
或者以某种方式达到类似的效果?

4

1 回答 1

0

符号链接路线会非常非常混乱。当被迫这样做时,我会通过#define在相关文件中添加一些 s 作为预构建步骤来实现这一点。然后我会#if在代码中存在这些符号。不过我一点也不喜欢这个:我的猜测是,即使我在构建结束后清除了这个标记,它也不会像我想要的那样透明,因此它不会进入版本控制。

ReadWriteDAL要包含它自己的一些状态,还是只是一个用于调用ReadDALand的方法的调度程序WriteDAL?如果它只是一个调度程序,您可能会考虑放弃实际的实现 ( ) 并使用动态代理机制ReadWriteDAL将调用传递给在组合根中注册的IReadDAL和。我为温莎城堡写了一个类似的工具。IWriteDAL

于 2017-10-16T13:00:33.637 回答