Как получить доступ к объекту Logger в последующем объекте? - PullRequest
1 голос
/ 23 апреля 2019

Рассмотрим следующую структуру проекта для веб-проекта .NET Core.

Проект MyApp.UI (MVC) вызывает MyApp.BusinessRules, вызывает MyApp.ServiceLayer, вызывает MyApp.DbAccess, проект вызывает, что угодно.

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

Так как же получить доступ к регистратору?

1 Ответ

2 голосов
/ 23 апреля 2019

Регистратор не должен быть определен на уровне пользовательского интерфейса. Это междисциплинарная задача, поэтому вы должны определить ее во внешней библиотеке и указать, что во всех проектах вам нужно вести журнал.

Если вы хотите регистрировать только исключения, вы можете определить глобальный обработчик исключений, пусть исключения всплывают на уровень пользовательского интерфейса и регистрируют их там. Пример здесь

В случае, если вы действительно хотите полностью передать Logger вниз, вы можете использовать Action в качестве параметра в методах и передать лямбду с вызовом метода, который вы хотите вызвать ниже по потоку.

    public class Logger
    {
        public string Message { get; set; }

        public void Log(string message)
        {
            Message = message;
        }
    }

    public class Business
    {
        public void DoWork(int id, Action<string> logAction)
        {
            if (id < 0)
            {
                logAction("The string is less than zero");
            }
        }
    }

Телефонный код

Logger logger = new Logger();
Business business = new Business();

business.DoWork(-1, (message) => logger.Log(message));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...