c# - 静态工厂 - 好的做法吗?

标签 c# design-patterns logging static factory-pattern

我有一个静态日志管理器类,它应该根据参数返回所需记录器的实例。

public static class LogManager {

    private static ILoggerFactory Factory { ... }

    public static ILogger GetLogger(string name) {
        return Factory.Create(name);
    }

}

由于必须设置 ILoggerFactory 的具体实现(初始化),我想知道是否应该只保留实现类型的引用并在每次请求工厂时返回一个新实例 - 或者是否可以保留实现实例的静态引用。

版本 1

private static Type _factoryType;

public static void SetFactory<TFactory>()
    where TFactory : ILoggerFactory, new()
{
    _factoryType = typeof(TFactory);
}

private static Factory {
    get { return (ILoggerFactory)Activator.CreateInstance(_factoryType);
}

public static ILogger GetLogger(string name) {
    return Factory.Create(name);
}

版本 2

private static ILoggerFactory _loggerFactory;

public static void SetFactory<TFactory>()
    where TFactory : ILoggerFactory, new()
{
    _loggerFactory = (ILoggerFactory)Activator.CreateInstance<TFactory();
}

public static ILogger GetLogger(string name) {
    return _loggerFactory.Create(name);
}

最佳答案

可以说,主要区别似乎在于延迟加载:v1 将在调用 GetLogger 时创建记录器类型,而 v2 将在 SetFactory 期间创建记录器。其他方面没有太大区别。可以将记录器类型或工厂本身的引用保留为私有(private)静态字段。

但是,如果这是生产代码,我会完全摆脱这个日志管理器和工厂。相反,我会直接使用日志框架,例如 nlog 或 log4net。这简化了代码并使其更易于维护。在这种情况下构建抽象是过度设计的。

关于c# - 静态工厂 - 好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25121335/

相关文章:

c# - WPF 的 Windows 8 现代 UI 样式

c# - 使用 Process 类的 C# 应用程序中的 ffmpeg - 用户提示未显示在标准错误中

java - 我对装饰模式的理解正确吗?

c# - 具有复杂逻辑的对象到对象转换

java - 除了log4j xml、属性文件和源代码(主要是java)之外,还有其他方式配置日志吗?

logging - TFS2015 vNext 构建失败 :MSBUILD : error MSB4017: The build stopped unexpectedly because of an unexpected logger failure

logging - 将集中式日志记录添加到使用systemd的kubernetes集群

c# - 我创建了一个多项选择的 C# 控制台程序,我放置了一个奖励阶段,但是当它到达它时,没有任何显示

javascript - 无法使用 ASP.NET 获取输入值

java - 我该如何改进这个单例?