Должен ли я использовать log4net непосредственно в объектах модели моего домена? - PullRequest
2 голосов
/ 24 апреля 2009

Мне интересно, если это плохая практика - использовать log4net непосредственно на моем доменном объекте ... Я буду использовать ELMAH для своих исключений на стороне приложения ASP.NET MVC, но для некоторых информационных целей я бы записать некоторые данные о самой модели предметной области.

Имеется следующий объект домена:

   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 ]

3 голосов
/ 24 апреля 2009

Я использовал log4net и log4J непосредственно в доменных объектах. Это имеет хорошие побочные эффекты и плохие.

  • + : регистрация в доменном объекте проста и понятна для кода, и вы знаете, что можете воспользоваться возможностями log4net.
  • - : это означает, что программа, использующая объекты домена, должна обращать внимание на конфигурацию log4net, которая может быть или не быть проблемой
  • - : Вы не можете связать свой доменный объект с версией log4net, отличной от используемой вызывающей программой. Я видел множество конфликтов с одним элементом, связанным с log4net 1.2.0.10, а другим - с более ранним выпуском.

Не регистрировать в вашем доменном объекте - плохая идея. Альтернатива, как другие предложили, - внедрение зависимостей или внешняя структура (такая как регистрация общего доступа для log4J), которая позволяет подключать различные структуры ведения журнала или создавать интерфейс, который выполняет регистрацию и регистрацию для этого интерфейса. (Код, использующий ваш доменный объект, должен затем предоставить соответствующий экземпляр этого интерфейса для целей регистрации.)

1 голос
/ 28 апреля 2009

Если вы собираетесь регистрироваться с объектов вашего домена и используете контейнер IOC, который вы, возможно, захотите поменять, я бы порекомендовал вам использовать шаблон Service Locator (вы можете посмотреть на архитектуру Sharp # для хорошей реализации SafeServiceLocator, который оборачивает ServiceLocator от msoft более информативными сообщениями об ошибках).

Я также хотел бы предложить вам подумать, хотите ли вы регистрировать тип ошибки, которую вы показываете в своем примере. Я бы хотел, чтобы объект домена выдавал исключение в этом случае и позволял вызывающей стороне решить, было ли это то, что ожидалось приложением (и, следовательно, не должно регистрироваться), или это представляет ситуацию, которую хочет вызывающая сторона. иметь дело с каким-то образом.

1 голос
/ 24 апреля 2009

Это классический вопрос!

Хороший способ сделать это - ввести член класса типа ILogger и абстрагировать вход в этот интерфейс. В вашем классе, где бы вы ни звонили, чтобы что-то регистрировать, делайте это через этот интерфейс. Затем внедрите эту зависимость во время выполнения с помощью одной из реализаций, используя один из доступных контейнеров IoC или Farmeworks для внедрения зависимостей. По умолчанию вы можете использовать log4net для реализации этого интерфейса.

Вот длинный список доступных структур внедрения зависимостей: http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx

0 голосов
/ 24 апреля 2009

Я думаю, что ведение журнала является сквозной задачей, поэтому лучше всего это делать аспектно-ориентированным способом. Если вы используете фреймворк, такой как Spring.NET, он вам доступен.

...