C# 包装器类太多 class LogUtil:ILogUtility { log4net.ILog日志; 公共LogUtil() { log=log4net.LogManager.GetLogger(typeof(T).FullName); } 公共无效日志(日志类型、日志类型、字符串消息) { WriteLine(“来自类{0}-message{1}的日志记录,typeof(T).FullName,message); } } 公共类记录器 { 我的直觉(logutility);; 公共记录器(ILogUtility) { _logutility=logutility; } 公共无效日志(日志类型、日志类型、字符串消息) { _logutility.Log(日志类型,消息); } }
我需要具有灵活的功能,并且能够在将来删除LogUtil类并使用其他东西 因此,我编写了LoggerUtility包装类,如下所示:C# 包装器类太多 class LogUtil:ILogUtility { log4net.ILog日志; 公共LogUtil() { log=log4net.LogManager.GetLogger(typeof(T).FullName); } 公共无效日志(日志类型、日志类型、字符串消息) { WriteLine(“来自类{0}-message{1}的日志记录,typeof(T).FullName,message); } } 公共类记录器 { 我的直觉(logutility);; 公共记录器(ILogUtility) { _logutility=logutility; } 公共无效日志(日志类型、日志类型、字符串消息) { _logutility.Log(日志类型,消息); } },c#,generics,log4net,C#,Generics,Log4net,我需要具有灵活的功能,并且能够在将来删除LogUtil类并使用其他东西 因此,我编写了LoggerUtility包装类,如下所示: class LogUtil<T> : ILogUtility { log4net.ILog log; public LogUtil() { log = log4net.LogManager.GetLogger(typeof(T).FullName); } public void Log(LogT
class LogUtil<T> : ILogUtility
{
log4net.ILog log;
public LogUtil()
{
log = log4net.LogManager.GetLogger(typeof(T).FullName);
}
public void Log(LogType logtype, string message)
{
Console.WriteLine("logging coming from class {0} - message {1} " , typeof(T).FullName, message);
}
}
public class Logger
{
ILogUtility _logutility;
public Logger(ILogUtility logutility)
{
_logutility = logutility;
}
public void Log(LogType logtype, string message)
{
_logutility.Log(logtype, message);
}
}
class LoggerUtility<T>
{
Logger logger;
public LoggerUtility()
{
LogUtil<T> logutil = new LogUtil<T>();
logger = new Logger(logutil);
}
public void Log(LogType logtype, string message)
{
logger.Log(logtype, message);
}
}
public class TestCode
{
public void test()
{
new LoggerUtility<TestCode>().Log(LogType.Info, "hello world");
}
}
类日志实用程序
{
记录器;
公用事业()
{
LogUtil LogUtil=新的LogUtil();
记录器=新记录器(logutil);
}
公共无效日志(日志类型、日志类型、字符串消息)
{
logger.Log(日志类型,消息);
}
}
我的客户代码如下:
class LogUtil<T> : ILogUtility
{
log4net.ILog log;
public LogUtil()
{
log = log4net.LogManager.GetLogger(typeof(T).FullName);
}
public void Log(LogType logtype, string message)
{
Console.WriteLine("logging coming from class {0} - message {1} " , typeof(T).FullName, message);
}
}
public class Logger
{
ILogUtility _logutility;
public Logger(ILogUtility logutility)
{
_logutility = logutility;
}
public void Log(LogType logtype, string message)
{
_logutility.Log(logtype, message);
}
}
class LoggerUtility<T>
{
Logger logger;
public LoggerUtility()
{
LogUtil<T> logutil = new LogUtil<T>();
logger = new Logger(logutil);
}
public void Log(LogType logtype, string message)
{
logger.Log(logtype, message);
}
}
public class TestCode
{
public void test()
{
new LoggerUtility<TestCode>().Log(LogType.Info, "hello world");
}
}
公共类测试代码
{
公开无效测试()
{
新的LoggerUtility().Log(LogType.Info,“hello world”);
}
}
为了从LogUtil获得松散耦合,我最终编写了两个包装器类Logger和LoggerUtility。所以在将来,如果我必须添加另一种方法
在ILogUtility中,我必须将该方法添加到Logger类,然后添加到LoggerUtility
编写LoggerUtility的最佳方法是什么,这样我就可以按如下方式编写客户端代码:
class LogUtil<T> : ILogUtility
{
log4net.ILog log;
public LogUtil()
{
log = log4net.LogManager.GetLogger(typeof(T).FullName);
}
public void Log(LogType logtype, string message)
{
Console.WriteLine("logging coming from class {0} - message {1} " , typeof(T).FullName, message);
}
}
public class Logger
{
ILogUtility _logutility;
public Logger(ILogUtility logutility)
{
_logutility = logutility;
}
public void Log(LogType logtype, string message)
{
_logutility.Log(logtype, message);
}
}
class LoggerUtility<T>
{
Logger logger;
public LoggerUtility()
{
LogUtil<T> logutil = new LogUtil<T>();
logger = new Logger(logutil);
}
public void Log(LogType logtype, string message)
{
logger.Log(logtype, message);
}
}
public class TestCode
{
public void test()
{
new LoggerUtility<TestCode>().Log(LogType.Info, "hello world");
}
}
newloggerutility().Log(LogType.Info,“hello world”);
请让我知道
谢谢你,你不需要第二个包装器,你需要一个工厂或者使用依赖注入框架来围绕log4net构建一个合适的包装器 使用Ninject并修改界面,您可以
new LoggerUtility<TestCode>().Log(LogType.Info, "hello world");
kernel.Bind(typeof(ILogUtility)).To(typeof(Log4NetUtil);
并将其实例化为
kernel.Bind(typeof(ILogUtility<>)).To(typeof(Log4NetUtil<>);
var logger=kernel.Get();
其中,记录器接口/类为:
var logger = kernel.Get<ILogUtility<MyClass>>();
公共接口的可扩展性,其中T:class
{
无效日志(日志类型、日志类型、字符串消息);
}
公共类Log4NetUtil:ILogUtility其中T:class
{
log4net.ILog日志;
公共LogUtil()
{
log=log4net.LogManager.GetLogger(typeof(T).FullName);
}
公共无效日志(日志类型、日志类型、字符串消息)
{
WriteLine(“来自类{0}-message{1}的日志记录,typeof(T).FullName,message);
}
}
看起来您正在添加一个不需要的抽象级别
如果我们从您的最终结果开始,LoggerUtility只需要有一个接口,它可以根据LogType
参数来记录事情
您当前编写的Logger
类只不过是ilogutability
接口的一个薄薄的包装。那么为什么要添加该层呢?为什么Logger
类不能直接使用ilogutability
实例呢?您甚至可以更进一步,将您的接口定义为ilogutability
要知道,当您创建一个LoggerUtility
时,它将使用的记录器实例将基于Foo类
但老实说,我认为您可能只是在这里重新发明轮子。看看。它可能会减轻您的努力,并从长远来看更有意义。您真正改变日志基础结构的频率有多高?这似乎不太常见。但我仍然希望flexibility@dotnet-医生:那不是你的错ally是有道理的。你是说设置DI框架的代码会写入记录器吗?在这种情况下,特定的代码段可以直接创建实例。在所有其他情况下,你应该注入记录器。@dotnet Practicer-我已经用Ninject的示例更新了。