基于PER-FILE的C#编译器常量?

时间:2016-12-09 19:25:39

标签: c# .net visual-studio multiple-inheritance compiler-constants

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

背景: 我想实现一个数据库抽象层(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中定义的方法,并且我必须复制粘贴方法实现的某处,这意味着将出现干旱不合规。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

ReadWriteDAL是否会包含某些状态,或者它只是调用ReadDALWriteDAL方法的调度程序?如果它只是一个调度程序,您可以考虑放弃实际实施(ReadWriteDAL)并将调用传递给在合成根中注册的IReadDALIWriteDAL,使用{{3} }。我为Castle Windsor写了dynamic proxy mechanism