2

我想知道直接在我的域对象上使用 log4net 是否是不好的做法......我将在 ASP.NET MVC 应用程序端使用 ELMAH 来处理我的异常,但出于某些信息目的,我想记录一些数据关于域模型本身。

给定以下域对象:

   public class Buyer
{
    private int _ID;
    public int ID
    {
        get { return _ID; }
        set
        {
            _ID = value;
        }
    }

    private IList<SupportTicket> _SupportTickets=new List<SupportTicket>();
    public IList<SupportTicket> SupportTickets
    {
        get
        {
            return _SupportTickets.ToList<SupportTicket>().AsReadOnly();
        }
    }

    public void AddSupportTicket(SupportTicket ticket)
    {
        if (!SupportTickets.Contains(ticket))
        {
            _SupportTickets.Add(ticket);
        }
    }
}

在 AddSupportTicketMethod 中添加日志记录行为是一个坏主意......所以它看起来像这样:

       public class Buyer
{
    protected static readonly ILog log = LogManager.GetLogger(typeof(SupportTicket));

    public Buyer()
    {
       log4net.Config.XmlConfigurator.Configure();
    }


    private int _ID;
    public int ID
    {
        get { return _ID; }
        set
        {
            _ID = value;
        }
    }

    private IList<SupportTicket> _SupportTickets=new List<SupportTicket>();
    public IList<SupportTicket> SupportTickets
    {
        get
        {
            return _SupportTickets.ToList<SupportTicket>().AsReadOnly();
        }
    }

    public void AddSupportTicket(SupportTicket ticket)
    {
        if (!SupportTickets.Contains(ticket))
        {
            _SupportTickets.Add(ticket);
        } else {
           log.Warn("Duplicate Ticket Not Added.");
        }
    }
}
4

4 回答 4

3

我在域对象中直接使用了 log4net 和 log4J。这有好的副作用和坏的副作用。

  • +:在域对象中登录是简单直接的代码,并且您知道您可以利用 log4net 功能。
  • -- : 表示使用域对象的程序需要注意log4net的配置,可能有问题,也可能没有问题
  • --:您不能将域对象链接到与调用程序使用的不同的 log4net 版本。我已经看到一个与 log4net 1.2.0.10 相关联的项目和另一个与早期版本相关联的项目发生了很多冲突。

不登录您的域对象是个坏主意。另一种方法是正如其他人所建议的那样,依赖注入或外部框架(例如 log4J 的 commons-logging)允许插入不同的日志框架或创建一个接口来执行日志记录和针对该接口进行日志记录。(使用您的域对象的代码需要提供该接口的适当实例以用于日志记录。)

于 2009-04-23T23:04:03.957 回答
1

这是一个经典的问题!

这样做的好方法是引入 ILogger 类型的类成员并将日志记录抽象到此接口中。在您的班级中,无论您在哪里调用以记录某些内容,都可以通过此接口进行。然后在运行时使用可用的 IoC 容器之一或依赖注入farmeworks 中的一种实现注入此依赖项。默认情况下,您可以使用此接口的 log4net 实现。

这是可用依赖注入框架的长列表: http ://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx

于 2009-04-23T22:46:56.417 回答
1

如果你要从你的域对象记录并且你使用一个你可能想要换出的 IOC 容器,我建议你使用服务定位器模式(你可以查看 Sharp# 架构以获得一个很好的 SafeServiceLocator 实现用更多信息错误消息包装 msoft 的 ServiceLocator)。

我还想建议您考虑是否要记录您在示例中显示的错误类型。在这种情况下,我倾向于让域对象抛出异常,并让调用者决定这是否是应用程序所期望的(因此不应该被记录),或者这是否代表调用者想要的情况以某种方式处理。

于 2009-04-28T18:46:29.867 回答
0

我认为日志记录是一个横切关注点,因此最好以面向方面的方式完成。如果您使用的是 Spring.NET 之类的框架,那么您可以使用它。

于 2009-04-23T22:48:22.293 回答