微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

是否可以在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.

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

解决方法

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

ReadWriteDAL是否包含它自己的某些状态,或者它只是调用ReadDAL和WriteDAL的方法调度程序?如果它只是一个调度程序,你可以考虑放弃实际的实现(ReadWriteDAL)并将调用传递给在组合根中注册的IReadDAL和IWriteDAL,使用dynamic proxy mechanism.我为Castle Windsor写了a tool like that.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐