Как отладить и найти источник ошибки «NullReferenceException» при загрузке сервисов C # с использованием Lamar? - PullRequest
0 голосов
/ 28 октября 2019

В нашем проекте есть несколько сервисов, которые мы недавно портировали на .NetCore 3.0. Кроме того, поскольку StructureMap должен находиться в режиме заката, мы удалили все ссылки и перешли на Lamar, поскольку он был самым быстрым для перехода. При начальной загрузке один из сервисов выдает «System.NullReferenceException:« Ссылка на объект не установлена ​​на экземпляр объекта ». Конечно, я переписал классы реестра для Lamar. Я не смог найти какие-либо полезные методы диагностики в Lamar, чтобы найти источник ошибки. Пожалуйста, дайте мне знать, если кто-то может подсказать мне, как перехватить источник ошибки, потому что теперь стек вызовов просто предоставляет инициализирующий вызов Bootstrap в качестве источника ошибки. Мы ищем все сборки с определенной строкой в ​​имени сборки, например: "Project-Name"

var container = new Container(x =>
                    x.Scan(y =>
                    {
                        // Scan all DLLs for Registries
                        y.AssembliesFromApplicationBaseDirectory(
                                assembly =>
                                {
                                     if (assembly.FullName.Contains("Project-Name"))
                                    {
                                        return true;
                                    }
                                    return false;
                                });

                        y.LookForRegistries();

                    }));

1 Ответ

0 голосов
/ 30 октября 2019

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

Просто хотел добавить больше информации на случай, если это кому-нибудь пригодится. «container.AssertConfigurationIsValid ()» полезен только в случае успешной инициализации контейнера. Для меня сам контейнерный инициатор ломался. Таким образом, Assert вообще не был полезен.

Но в случае инициализации контейнера, при этом вызовы IoC не выполняются или возникают ошибки типа «XYZInterface не зарегистрирован в этом контейнере и не может быть автоматически обнаружен какой-либо отсутствующей семейной политикой», этиможно определить, установив Watch на значение времени выполнения вашего контейнера и проверив, имеет ли свойство ErrorMessages значения. Это поможет вам лучше понять, что на самом деле нарушает инициализацию службы. В окне Immediate вы можете проверить значение ErrorMessage для каждого из экземпляров.

Например: чтобы проверить значение сообщения об ошибке первого экземпляра в списке, установите флажок

((Lamar.InstanceRef[])((Lamar.QueryModel)container.Model).AllInstances)[0].Instance.ErrorMessages. 

. помогите определить другие нерешенные проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...