StructureMap - NullReferenceException

本文关键字:NullReferenceException StructureMap | 更新日期: 2023-09-27 17:58:43

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

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

StructureMap - NullReferenceException

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

调试这些场景的最佳解决方案是启用catch-all异常、Ctrl+Alt+E和mark-to-catch-all-throw异常。

下一个要转到的工具是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无法满足的复杂类型。