命名空间相同的方法两个地方/“命名空间端点”

时间:2017-04-10 06:39:11

标签: c# asp.net inheritance design-patterns

我正在为日志库创建一个外观项目/包装器。这个包装器将用于多个项目,包括现有项目和新项目。

命名空间就像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);
    }
}

但是我不确定这是否是设计它的正确方法,或者它是否应该被称为正常方法引用另一个? 我正在寻找关于如何设计它的一些最佳实践建议:)

1 个答案:

答案 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.
    }
}

如果你需要一些转换(旧的和新的实现在某种程度上有所不同),你可以利用继承来做到这一点。