Ошибка при входе в приложение Asp.net mvc внутри веб-приложения или уровня домена?

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

Я хотел бы, чтобы одно централизованное и простое место выполняло все мои журналы создания/удаления/обновления...

Я слышал об Elmah, но не уверен, насколько он полезен только для ведения журнала на уровне службы домена...

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

Если это имеет значение... Мне нужно использовать Ninject для внедрения в мой ILoggingService

ПРИМЕЧАНИЕ. Я не говорю о ведении журнала действий пользователей... которые определенно будут находиться только внутри моего уровня службы домена...


person Haroon    schedule 10.06.2011    source источник


Ответы (2)


Харун,

Используйте Ninject для создания и управления жизненным циклом ILoggingService. Реализация этой службы должна быть построена непосредственно поверх хорошо протестированной библиотеки ведения журналов, такой как NLog или log4net.

Когда у вас есть экземпляр службы, вы можете легко внедрить его либо в свой контроллер MVC, либо в свой уровень домена. Все ведение журнала должно происходить для этого экземпляра, а не для статического класса ведения журнала.

Это позволит вам иметь унифицированное ведение журнала, которое вы ищете, с четким разделением задач.

person nikmd23    schedule 10.06.2011
comment
Считаете ли вы, что лучше войти в мое приложение asp.net mvc или службу домена? - person Haroon; 10.06.2011
comment
imho разные слои регистрируют разные вещи. MVC (пользовательский уровень) может регистрировать все взаимодействия с пользователем, в то время как логические ошибки уровня домена и тому подобное. - person jgauffin; 10.06.2011

imho ведение журнала не должно вводиться. Причина в том, что большинство ваших сервисов (если не все) будут использовать ведение журнала.

Если вы посмотрите на большинство фреймворков ведения журналов (таких как nlog), они используют singleton/facade и абстрактные фабрики для обеспечения протоколирование.

Что-то типа:

public static class LogFactory
{
    private static ILogFactory _instance;

    public void Assign(ILoggingFactory factory)
    {
         _instance = factory;
    }

    public ILogger CreateFor<T>()
    {
        return _instance.CreateFor<T>();
    }
}

Дизайн делает ваши услуги зависимыми только от одного класса и одного интерфейса. Таким образом, по-прежнему очень легко переключать реализации ведения журнала.

В вашем классе используйте код вроде:

public class ServiceImp : IService
{
      private ILogger _logger = LogFactory.CreateFor<IService>();

      public void SomeMethod()
      {
           _logger.Warning("Something went wrong, but we can handle it. Hence only a warning");
      }
}
person jgauffin    schedule 10.06.2011
comment
Если бы я не вводил свой экземпляр журнала в свое приложение => Лично я считаю, что было бы лучше использовать базовый класс, который содержит ссылку на мой журнал для всех моих служб, вы чувствуете то же самое? - person Haroon; 10.06.2011
comment
Нет. Я бы не стал создавать базовый класс только для того, чтобы добавить поддержку ведения журнала (я настоятельно рекомендую не использовать базовые классы швейцарского армейского ножа, они нарушают так много принципов проектирования). Если у вас уже есть базовый класс, можно добавить к нему свойство регистратора. - person jgauffin; 10.06.2011