0

我们最近移植到 .NetCore 3.0 的项目中有一些服务。此外,由于 StructureMap 即将停用,我们删除了所有引用并正在迁移到 Lamar,因为它是迁移速度最快的。引导时,其中一项服务会抛出“System.NullReferenceException:'对象引用未设置为对象的实例”。当然,我重写了 Lamar 的注册表类。我在 Lamar 中找不到任何有用的诊断方法来找到错误的根源。请让我知道是否有人可以指导我如何捕获错误源,因为现在调用堆栈仅提供 Bootstrap init 调用作为错误源。我们在程序集名称中查找具有特定字符串的所有程序集,例如:“项目名称”

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();

                    }));
4

1 回答 1

0

我不知道这是否是正确的方法,但我想回答我自己的问题以将其标记为已关闭。我必须一个一个地构建我的项目,一个一个地注册它们以找到导致问题的项目。

只是想添加更多信息,以防它对某人有帮助。“container.AssertConfigurationIsValid()”仅在 Container 初始化成功时才有用。对我来说,Container init 本身就坏了。所以 Assert 根本没有用。

但是,如果 Container 被初始化但 IoC 调用失败或出现“XYZInterface 未在此容器中注册,并且无法通过任何缺失的家庭策略自动发现”之类的错误,则可以通过在容器运行时值上设置 Watch 并检查来识别这些错误如果 ErrorMessages 属性有值。这将使您更深入地了解实际破坏服务初始化的原因。在“立即”窗口中,您可以检查每个实例的 ErrorMessage 值。

例如:要检查列表中第一个实例的错误消息值,请检查

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

这将有助于识别其他重大问题。

于 2019-10-30T16:44:24.590 回答