我有3个不同的应用程序。我在一个共享库中有log4net,它可以在3个应用程序中共享。对所有3种服务使用相同的记录器是不好的做法。 我写过类似的东西
public class Log4netLogger
{
private ILog _logger = null;
public Log4netLogger(ILog logger)
{
_logger = logger;
}
public void write(Level logLevel, string message)
{
_logger.Logger.Log(_logger.GetType(),logLevel,message,null);
}
}
在我的应用程序1 app_start中,我正在注入这样的
myContainer.RegisterType<ILog>
(
new ContainerControlledLifetimeManager(),
new InjectionFactory(x => LogManager.GetLogger("Application 1"))
);
在我的代码中,我使用的是
_logger = myContainer.Resolve<log4net.ILog>();
Log4netLogger logMessage= new Log4netLogger(_logger);
logMessage.Write
(
log4net.Core.Level.Info,
logMessage
);
此外,我认为这种方法的一个负面因素是我在所有3个应用程序中都安装了log4net。所以我想知道我是做错了什么还是有更好的方法?
答案 0 :(得分:0)
如果你Log4net
松散耦合,这是一个很好的决定。然后,您可以将记录器放在不同的项目中并由所有应用程序共享。如果您需要并且需要,您可以隐藏中间件项目(服务,dal vs ..)的实现,您可以将界面和实现分离到不同的项目。
然后您的中间件类只知道接口,您可以更改logger的实现而无需重建或重新部署此服务(松散依赖)。
但是你不能在没有实现的情况下运行你的驱动程序项目(主项目),他们必须知道Log4Net(或使用相同接口的另一个库)的实现。
对于失去耦合:您的服务应该使用您的界面而不是log4net.ILog
。
我对log4net没有经验。但是here,他们将工厂用于log4net。这很好,您的服务将知道您的工厂而不是Log4Net,您的工厂将了解(Log4Net)。
链接上的代码:
public interface ILoggerFactory { ILogger Create(Type type); } public class LoggerFactory : ILoggerFactory { public ILogger Create(Type type) { return new Log4netLogger(type); } }
但我再说一遍,你不能放弃顶级(驱动)项目的耦合,因为他们必须知道所有的实现,否则他们不能注入。