我正在为日志库创建一个外观项目/包装器。这个包装器将用于多个项目,包括现有项目和新项目。
命名空间就像Logger.System.Fatal
,但由于现有项目过去常常使用另一个包装项目,因此使用了Logger.Fatal
。
所以使用新的方法,我希望能够从命名空间中的两个位置调用相同的方法。
但我该如何做呢?
我希望能够在两个地方都有相同的描述,但让Logger.Fatal
给出一个弃用/过时的警告。
我想过这样做:
public class Logger : LogHelper.System
{
[Obsolete("Logger.Trace is deprecated, use Logger.System.Fatal instead.")]
public static new void Fatal(string message)
{
//somehow call the method that we are inheriting from
}
public class System : LogHelper.System
{
public static new void Fatal(string message)
{
//somehow call the method that we are inheriting from
}
}
}
public class LogHelper
{
/// <summary>
/// Logs a message with the importance of Fatal
/// </summary>
/// <param name="message">The message to log</param>
public virtual void Fatal(string message)
{
//log the message
logger.Fatal(message);
}
}
但是我不确定这是否是设计它的正确方法,或者它是否应该被称为正常方法引用另一个? 我正在寻找关于如何设计它的一些最佳实践建议:)
答案 0 :(得分:1)
使用所有实现创建两个Logger
类,一个在“new”命名空间中。
旧命名空间中的另一个,继承自新命名空间,具有Obsolete
属性。
通过这种方式,您可以在正确的位置实施,旧命名空间中没有代码,并且针对旧地点的每个人都有过时的警告。
namespace Old
{
[Obsolete("Use New.NewLogger instead")]
public class OldLogger : New.NewLogger
{
}
}
namespace New
{
public class NewLogger
{
// All your implementation here.
}
}
如果你需要一些转换(旧的和新的实现在某种程度上有所不同),你可以利用继承来做到这一点。