首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于每个文件的C#编译器常量?

基于每个文件的C#编译器常量?
EN

Stack Overflow用户
提问于 2016-12-10 03:25:39
回答 1查看 107关注 0票数 4

是否可以在每个文件/项目项的基础上定义编译器常量?

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

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

代码语言:javascript
复制
abstract class ReadDAL
abstract class WriteDAL
abstract class ReadWriteDAL (multiple-inheritance from Read&Write-DAL).

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

因此,解决此问题的一种方法是定义接口:

代码语言:javascript
复制
abstract class ReadDAL : IReadDAL
abstract class WriteDAL : IWriteDAL
abstract class ReadWriteDAL : IReadDAL, IWriteDAL

然而,如果我这样做,我将不得不在每次更改DAL中的方法时更改接口定义,并更改在ReadWriteDAL中定义的方法,并且我必须复制粘贴到方法实现的某个位置,这意味着将会有一个干式不合规的混乱。

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

代码语言:javascript
复制
#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. 

但是我能以某种方式为每个文件定义一个编译器常量吗?

或者以某种方式达到类似的效果?

EN

回答 1

Stack Overflow用户

发布于 2017-10-16 21:00:34

符号链接路由将非常、非常令人困惑。当被迫这样做时,我会通过将一些#define作为预构建步骤预先添加到相关文件中来实现。然后,我将在代码中出现这些符号时执行#if。不过我一点也不喜欢这样:我猜这不会像我希望的那样透明,即使我在构建结束后清除了这个标记,这样它就不会进入版本控制。

ReadWriteDAL是否将包含自己的某种状态,或者它将只是对ReadDALWriteDAL的方法调用的调度程序?如果它只是一个分派器,您可以考虑删除实际的实现(ReadWriteDAL),并使用dynamic proxy mechanism将调用传递给在组合根中注册的IReadDALIWriteDAL。我为温莎城堡写了a tool like that

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41067527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档