2012-03-09 5 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もUnityがインスタンス化されるが、それは代わりに、コンストラクタ・インジェクションを使用しています作品):

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

どうすれば依存関係が失敗するのか確認できますインスタンス化する。例外は投げられていません(またはエルマが捕まえていない場合)。

+0

質問タイトルに_C#、Debugging、Unity、dependency injection_などのものは含めないようにしてください。それがタグのためのものです。 –

+0

私が通常このような場合に行うことは、自分のコードユニットをUnityの* source *プロジェクトにリンクして、Unityコードをステップ実行して、どのように問題が解決されているかを確認することです。 –

答えて

2

DependencyAttributeがインターフェイスではなく具象クラスにあるため、依存関係は注入されません。

DIはcan be harmful属性として、私はあなたがIFooServiceはその後、注入された依存関係を持つFooServiceのインスタンスを返します解決

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

への登録を変更することをお勧めします。

+0

プロパティ注入の代わりにコンストラクター注入を使用することも、より良いアドバイスです。 – Steven

+0

@スティーブンこれらの依存関係は、「必須」(コンストラクタインジェクション)または「持っている」(プロパティインジェクション)依存性に依存します。 –

+0

[Dependency]属性で明示的に装飾されたプロパティを挿入できない場合、Unityは失敗しないと私は少し驚いています。サイレントに失敗すると、構成がより壊れやすくなります。 – Steven

2

コールcontainer.Resolve<IFooService>();

/どのようIFooServiceの解像度が起こっているのでしょうか?

+0

FooServiceがどのようにインスタンス化され、その部分が動作するかを示す質問が更新されました。 –

+0

Unityとセッターの注入についてもっと知っている人は答えなければならないかもしれませんが(私はそれをしばらく使っていませんが)、コンストラクタに注入されたすべての依存関係を一時的に解決しようとします。もしそうでなければ、エラーが原因を教えてください。もしそうであれば、それはセッター注射がどのように設定されているかでなければなりません。 –

関連する問題