我有一个dll,我有一个类登录到“频道”,另一个程序监听“频道”并将日志写入屏幕。 dll的问题在于它随着时间的推移而增长,现在它有许多依赖性。我想从此dll中删除日志记录部分,并将其放在调试和记录dll中。
问题是调试和日志记录dll有另一个我希望在类中使用的命名空间,或者我想在命名空间中使用该类。我的问题是,有些开发人员在调用方法时几乎只使用命名空间,而不是在类的顶部使用它。
静态方法如下所示:
Base.Manager.Logging.Send("Log something");
另一个Dll具有简单的命名空间Trace 所以看起来应该是这样的:
Trace.Logging.Send("Log something");
我的问题是,是否有一种优雅的方法来移动类并更改命名空间而不改变方法的所有用途? 我可以简单地将类复制到另一个dll,然后使用旧类作为包装器,将所有调用转发到Trace.dll中的另一个类,但这种方法看起来有点hacky。
我希望这个grafik说明我的意思,因为我认为简单的文字可能有些令人困惑
仅供参考:我没有ReSharper
答案 0 :(得分:2)
不幸的是你做不到。如果你保留相同的命名空间,那么你可以使用TypeForwardAttribute
,但如果你也改变命名空间(不仅仅是汇编),那么它就不起作用。
我建议将它移到新的类中,让旧类不要在运行时和代码中断代码。编译时转发所有呼叫。将所有旧方法标记为过时(至少他们会被警告将来会改变代码)。只是为了澄清:
namespace Base.Manager {
public static class Logger {
public static void Send(string message) {
// Do things
}
}
第1步:清空旧的已弃用的类并将调用转发给新类。将旧方法标记为过时。
然后将重构为:
namespace Base.Manager {
[EditorBrowsable(EditorBrowsableState.Never)]
public static class Logger {
[Obsolete("This method is deprecated, please use Trace.Logger.Send")]
public static void Send(string message) {
// Delegate work to someone else...
Trace.Logger.Send(message);
}
}
在编译期间它会生成警告(带有给定的消息)。 编译时兼容性已保存。请注意,我们还添加了EditorBrowsableAttribute
,IntelliSense在开始输入时不会建议Logger
类。这减少了(一点点)他们仍然会使用Base.Manager.Logger
新代码的机会。
第2步:将来某天您会将该警告更改为错误:
[Obsolete("This method is obsolete, use Trace.Logger.Send", true)]
这将打破编译,但保留二进制兼容性。其他DLL仍将运行(因此您不必等待其他开发人员完成此重构任务)但除非他们更新,否则他们将无法编译。
第3步:完成所有操作并且所有人都搬到新课程后,只需从代码中删除Base.Manager.Logger
课程。
注意:所有进程都可以跨越各种版本:在2.0中你不赞成旧方法,在2.1中你打破编译,在3.0中你从代码中删除它(这在发布时特别有用)您的代码及其用户不同步。
关于名称冲突的一句话:请注意,两个不同命名空间中的相同类名(和方法)可能会导致恼人的名称冲突。想象一下,他们有这个代码:
using Base.Manager;
void DoSomething() {
Logger.Send("I'm doing something.");
}
更改后(直到Base.Manager.Logger
未删除),他们无法简单地添加其他using
:
using Base.Manager;
using Trace;
void DoSomething() {
Base.Manager.SomethingElse.DoIt();
// Compiler is confused: Base.Manager.Logger or Trace.Logger?
Logger.Send("I'm doing something.");
}
他们需要完全限定他们想要使用的记录器类:
Trace.Logger.Send("I'm doing something.");
警告:请注意,如果Trace
不是新的命名空间,那么如果名称冲突在代码中同时包含using
,那么名称冲突甚至可能会立即中断编译ObsoleteAttribute
无用)。
如果这对您/您的用户来说是个问题......我不能说。