2011-06-09 49 views
1

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

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

的ICustomerManager使用构造函数注入和接收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>(); 

我真的不知道从哪里开始调试,对于一般的概念来说是如此新鲜。任何关于在这样一个简单情况下可能出错的想法?

+0

可能重复[什么是NullReferenceException,我该如何解决它?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-doi-i-fix-它) – Nasreddine 2015-10-04 09:08:14

回答

2

您很可能会得到一个异常,即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无法满足的复杂类型。

+1

问题最终与具体对象本身而不是StructureMap相关。感谢提示 - 他们帮助我完成了淘汰的过程。 – jdraper3 2011-06-09 17:31:56

+0

我已经去过很多次了,而且这种方法在我相信每次都会解决我的问题。我相信2或3年前,我确实在StructureMap中遇到了一个自修正以来的bug。 – 2011-06-09 17:57:59

+1

我们的网络应用程序中有一个将WhatDoIHave()转储到浏览器的路径。很有用。 – 2011-06-11 01:28:23