Как отладить и найти источник ошибки "NullReferenceException" при начальной загрузке служб C# с использованием Lamar?
В нашем проекте есть несколько сервисов, которые мы недавно перенесли на.NetCore 3.0. Кроме того, поскольку StructureMap должен быть закрыт, мы удалили все ссылки и перешли на Lamar, поскольку он был самым быстрым для миграции. При начальной загрузке одна из служб выбрасывает "System.NullReferenceException: 'Ссылка на объект не установлена на экземпляр объекта". Конечно, я переписал классы реестра для Ламара. Я не смог найти в 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 ответ
Я не знаю, правильный ли это способ, но я хочу ответить на свой вопрос, чтобы отметить его как закрытый. Мне приходилось создавать свои проекты один за другим, регистрировать их один за другим, чтобы найти проект, который вызывал проблему.
Просто хотел добавить дополнительную информацию, если она кому-то будет полезна. "container.AssertConfigurationIsValid()" полезен только в случае успешной инициализации контейнера. Для меня ломался сам Container init. Итак, Assert вообще бесполезен.
Но в случае, если контейнер инициализируется, но вызовы IoC завершаются сбоем или возникают ошибки, такие как "XYZInterface не зарегистрирован в этом контейнере и не может быть автоматически обнаружен какой-либо отсутствующей семейной политикой", их можно определить, установив Watch на значение времени выполнения вашего контейнера и проверив если свойство ErrorMessages имеет значения. Это даст вам больше информации о том, что на самом деле нарушает инициализацию службы. В окне "Немедленное" вы можете проверить значение ErrorMessage для каждого из экземпляров.
Например: чтобы проверить значение сообщения об ошибке для первого экземпляра в списке, отметьте
((Lamar.InstanceRef[])((Lamar.QueryModel)container.Model).AllInstances)[0].Instance.ErrorMessages.
Это поможет выявить другие критические проблемы.