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