2012-03-09 68 views
2

當依賴沒有實例化時,如何調試依賴注入(使用Unity DI)?如何調試依賴項無法實例化時?

如給定一個服務類的依賴關係:

public class FooService : IFooService 
{ 
    [Dependency] 
    public BarService BarService { get; set; } 
    [Dependency] 
    public AnotherService AnotherService { get; set; } 

    // other code fails because BarService and AnotherService are null 
} 

而且在Global.asax.cs中

private void ConfigureIoC() 
{ 
    container 
     .ConfigureAutoRegistration() 
     .LoadAssembliesFrom(assemblyPaths) 
     .ExcludeSystemAssemblies() 
     .Include(If.Any, Then.Register()) 
     .ApplyAutoRegistration(); 

    var serviceLocator = new UnityServiceLocator(container); 
    ServiceLocator.SetLocatorProvider(() => serviceLocator); 
} 

的IFooService也由統一實例化,但使用構造函數注入,而不是(這作品):

public class FooController : Controller 
{ 
    private readonly IFooService _fooService; 
    public FooController(IFooService fooService) 
    { 
     _fooService = fooService; 
    } 
} 

我該如何調試,看看爲什麼依賴關係失敗要實例化。沒有例外被拋出(或者如果他們是Elmah沒有捕獲和記錄它們)。

+0

請避免在您的問題標題中包含諸如_C#,調試,Unity,依賴注入等內容。這就是標籤的用途。 – 2012-03-09 01:21:44

+0

我在這種情況下通常會做的事情是將我的代碼單元與Unity的* source *項目鏈接起來,然後再單步執行Unity代碼,以查看如何解決問題。 – 2012-03-09 04:17:18

回答

2

不會注入依賴關係,因爲DependencyAttribute位於具體類而不是接口。

由於DI屬性can be harmful我會建議您更改登記

container.RegisterType<IFooService,FooService>(new InjectionProperty("BarService"), new InjectionProperty("AnotherService")); 

解決IFooService然後將注入的依賴返回FooService一個實例。

+0

更好的建議是使用構造函數注入而不是屬性注入。 – Steven 2012-03-09 08:06:10

+0

@Steven取決於這些依賴關係是「必須擁有」(構造函數注入)還是「很好擁有」(屬性注入)依賴關係,您是絕對正確的。 – 2012-03-09 08:13:18

+0

我必須說我有點迷惑,當用[Dependency]屬性明確裝飾的屬性不能被注入時,Unity不會失敗。失敗無聲地讓配置變得更加脆弱。 – Steven 2012-03-09 08:17:49

2

呼叫container.Resolve<IFooService>();

在哪裏/如何IFooService的分辨率發生了什麼?

+0

我更新了問題以顯示FooService如何實例化,並且該部分有效。 – 2012-03-09 04:03:15

+0

對Unity和setter注有更多瞭解的人可能不得不回答(我有一段時間沒有用過它),但是我會暫時嘗試將所有構造函數注入的依賴關係,只看它們是否解決。如果他們不這樣做,錯誤應該告訴你爲什麼。如果他們這樣做了,那麼它一定是你如何設置注射器注射。 – 2012-03-09 05:11:22