【问题标题】:StructureMap - NullReferenceExceptionStructureMap - NullReferenceException
【发布时间】:2011-06-09 16:36:56
【问题描述】:

我是 IoC 的新手,我正在尝试开始使用 StructureMap,但是当我尝试获取对象实例时它会抛出 NullReferenceException。这是我的初始化代码:

ObjectFactory.Initialize(x =>
{
    x.ForRequestedType<IRepository<Customer>>().TheDefaultIsConcreteType<EFRepository<Customer>>();             
    x.ForRequestedType<ICustomerManager>().TheDefaultIsConcreteType<CustomerManager>();
});

ICustomerManager 使用 ctor 注入并接收 IRepository:

public class CustomerManager : ICustomerManager
{
  IRepository<Customer> _repository;
  public CustomerManager(IRepository<Customer> repository)
  {
    _repository = repository;
  }

  public Customer GetCustomerById(int id)
  {
    return _repository
             .With(c => c.PhoneNumbers)
             .FirstOrDefault<Customer>(c => c.Id == id);
  }

  public IEnumerable<Customer> GetCustomersByName(string lastName, string firstName, string middleName)
  {
    return _repository.Query(new CustomerMatchesName(lastName, firstName, middleName));
  }
}

然后在我的服务层代码中,这行抛出异常:

var manager = ObjectFactory.GetInstance<ICustomerManager>();

我真的不知道从哪里开始调试它,因为我对这些概念都很陌生。关于在这样一个简单的场景中可能出现什么问题的任何想法?

【问题讨论】:

标签: c# dependency-injection structuremap


【解决方案1】:

您很可能会遇到 StructureMap 无法构建对象的异常,这会导致空引用的级联异常,该异常已经吃掉了真正的异常。

调试这些场景的最佳解决方案是打开捕获所有异常,Ctrl+Alt+E 并标记以捕获所有抛出的异常。

下一个 goto 工具是 StructureMap 提供了一个实用方法ObjectFactory.WhatDoIHave();

在我的所有项目中,我在 Application_Start 的初始化代码中都有(我只做 asp.net),我有以下代码块

#if DEBUG
    string path = Server.MapPath("~/myproj.WhatDoIHave.txt");
    string whatDoIHave = ObjectFactory.WhatDoIHave();
    File.WriteAllText(path, whatDoIHave);
#endif

这个输出为我提供了无数次帮助。学习阅读此文件将使您基本上可以解决您遇到的任何注册问题,因为您将能够准确地看到您所做的和没有的。

大多数情况下,使用 StructureMap 时,您最终会解决您没有的问题。这通常归结为需要注册一个 StructureMap 无法满足的复杂类型。

【讨论】:

  • 问题最终出在具体对象本身而不是 StructureMap 上。感谢您的提示 - 他们帮助我完成了消除过程。
  • 我自己去过那里很多次,我相信这种方法每次都解决了我的问题。我确实相信 2 或 3 年前我确实遇到了 StructureMap 中的一个错误,该错误已被修复。
  • 我们的网络应用程序中有一个路由,它将 WhatDoIHave() 转储到浏览器。非常有用。
猜你喜欢
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多