的问题,使可继承的类与懒惰和静态方法



在我已经工作了几天的wcf net 6.0服务中,使用了NLog。有几个类库,在每个类库中都有相同的代码,只需更改类的名称即可完成简单的复制粘贴。

这个类以不同的名字出现了几次:someeclass1loggerservice, someeclass2loggerservice, someeclass3loggerservice, someeclass4loggerservice .....只有类名和日志文件名在改变。

public class SomeClassLoggerService
{
public static LogFactory Instance { get { return _instance.Value; } }
private static Lazy<LogFactory> _instance = new Lazy<LogFactory>(BuildLogFactory);
private static LogFactory BuildLogFactory()
{
string basePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string configFilePath = Path.Combine(basePath, "SomeClass.nlog");
LogFactory logFactory = new LogFactory();
logFactory.Configuration = new XmlLoggingConfiguration(configFilePath, logFactory);
return logFactory;
}
}

下面是获取日志实例的代码:

static NLog.ILogger _Logger = SomeClassxLoggerService.Instance.GetCurrentClassLogger();

我尝试创建一个像这样的派生类:

public class SomeDerivedClassLoggerService:SomeClassLoggerService
{
}

但问题是Assembly.GetExecutingAssembly()总是返回基类的名称和路径,我需要创建具有派生类名称和路径的日志。对我来说,似乎没有办法传递到someeclassloggerservice派生类的实例,这样它就可以在正确的地方创建日志(使用派生类名)。在这个示例中,SomeDerivedClassLoggerService的日志文件应该命名为SomeDerivedClass。

保存在SomeDerivedClass.dll的同一路径

也许您可以使用泛型并将派生类型作为泛型参数传递给基类?如果这是可以接受的,你可以这样写:

public abstract class SomeClassLoggerService<T> where T : SomeClassLoggerService<T>
{
public static LogFactory Instance { get { return _instance.Value; } }
private static Lazy<LogFactory> _instance = new Lazy<LogFactory>(BuildLogFactory);
private static LogFactory BuildLogFactory()
{
string basePath = Path.GetDirectoryName(typeof(T).Assembly.Location);
string configFilePath = Path.Combine(basePath, $"{typeof(T).Name}.nlog");
LogFactory logFactory = new LogFactory();
logFactory.Configuration = new XmlLoggingConfiguration(configFilePath, logFactory);
return logFactory;
}
}
public class SomeDerivedClassLoggerService : SomeClassLoggerService<SomeDerivedClassLoggerService>
{
}

最新更新