gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:56:25 24 4
gpt4 key购买 nike

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

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

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

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

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

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

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

但是,如果我这样做,每次更改其中一个 DAL 中的方法和更改 ReadWriteDAL 中定义的方法时,我都必须更改接口(interface)定义,并且我必须将方法实现复制粘贴到某处,这意味着将会出现 DRY 不合规困惑。

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

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

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

最佳答案

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

ReadWriteDAL 是否会包含它自己的某些状态,或者它是否只是一个调度程序,用于调用 ReadDALWriteDAL?如果它只是一个调度程序,您可能会考虑放弃实际实现 (ReadWriteDAL) 并将调用传递给在组合根中注册的 IReadDALIWriteDAL,使用 dynamic proxy mechanism .我写了a tool like that温莎城堡。

关于基于每个文件的 C# 编译器常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41067527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com