是否可以在每个文件/项目项的基础上定义编译器常量?
背景:我想实现一个数据库抽象层( DAL ),它将所有读取和写入任务分开,但保留一个可以同时执行这两个任务的DAL,但不需要多次实现相同的方法(抽象类意味着每个支持的数据库类型都有一个实例类)。
所以我想像这样分隔我的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中定义的方法,并且我必须复制粘贴到方法实现的某个位置,这意味着将会有一个干式不合规的混乱。
我想我可以做的是第二次添加相同的文件作为链接,并在每个项目项的基础上进行定义:
#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. 但是我能以某种方式为每个文件定义一个编译器常量吗?
或者以某种方式达到类似的效果?
发布于 2017-10-16 21:00:34
符号链接路由将非常、非常令人困惑。当被迫这样做时,我会通过将一些#define作为预构建步骤预先添加到相关文件中来实现。然后,我将在代码中出现这些符号时执行#if。不过我一点也不喜欢这样:我猜这不会像我希望的那样透明,即使我在构建结束后清除了这个标记,这样它就不会进入版本控制。
ReadWriteDAL是否将包含自己的某种状态,或者它将只是对ReadDAL和WriteDAL的方法调用的调度程序?如果它只是一个分派器,您可以考虑删除实际的实现(ReadWriteDAL),并使用dynamic proxy mechanism将调用传递给在组合根中注册的IReadDAL和IWriteDAL。我为温莎城堡写了a tool like that。
https://stackoverflow.com/questions/41067527
复制相似问题