2016-09-07 11 views
0

問題が発生しましたこのNullReferenceExceptionを修正する方法を理解できないため、解決策が見つからないようです。コンストラクタでUnity依存関係を使用できません

私は自分のコンストラクタを持っています。

public MainViewModel() 
{ 
    this.Refresh = new DelegateCommand(this.DoRefresh); 
    //...More like this... 
    //...and finally... 
    this.InitializeObjects(); 
} 

は、次にどこかの特性との間の依存性最後に

[Dependency] 
public IUnityContainer Container { get; set; } 

とがあるInitializeObjects法例外は3行目でスローさ

private void InitializeObjects() 
{ 
using (var context = this.Container.Resolve<IDbContextScope>()) 
{ 
    //...remainder of the method... 
} 
} 

「コンテナ」にとNullReferenceExceptionを生成しますこのコードブロックのうち、 'using(var ...')で始まる行

例外はArgumentNullExceptionです。

Message "Value cannot be nul.Parameter name: container" 
Source = Microsoft.Practices.Unity 
StackTrace = at Microsoft.Practices.Unity.UnityContainerExtensions.Resolve....etc.. 

私の具体的な質問は次のとおりです。 実際にIUnityContainerコンテナが例外をスローしていますか? なぜ例外がスローされますか? これを回避するにはどうすればよいですか?

編集:ポストの下にある最初の2/3のコメントで見たよう

、とNullReferenceExceptionの原因がアサートされています。しかし、私はあなたの毎日のNREとしてこれを経験しないので、を回避する方法はまだ分かりません。コンテナを必要とする関数は、プログラムが機能するために必要な値を初期化するためにそこにあり、したがって、コンストラクタのINSIDEと呼ばれる必要があります。 AFAIK私は依存関係を宣言するだけではないので、どうすればこの問題を回避できますか?

+0

'Resolve'は、Resolve(this UnityContainerコンテナ)のようなシグネチャを持つ拡張メソッドです。問題は 'public IUnityContainer Container {get;}です。セット; } 'は'ヌル 'です。これは何とか魔法のように設定されていません。コンテナの依存関係を満たすために、 'MainViewModel'を設定するにはUnityが必要です。誰でもメインビューモデルをインスタンス化する人は、これを行う責任があります。 – Will

+0

@Will具体的には、これは、IUnityContainerが実際の値にまだ設定されておらず、コンストラクタが構築完了するまでnullのままであるため、MainViewModel()のコンストラクタ内でInitializeObjects()関数(IUnityContainerを利用する)を呼び出せないことを意味します。 'MainViewModel? – Ciphra

+0

途中で99%、はい。通常、オブジェクトに著しい依存性がある場合、そのオブジェクトのインスタンスをUnityコンテナから取得する必要があります。もしあなたがそうしているなら、おそらく、コンストラクタの実行中に依存関係を利用できるようにコンストラクタインジェクションを使うべきでしょうか? 'public MainViewModel(IUnityContainer muhContainer)'を呼び出し、[Dependency]プロパティを削除します。あなたの問題はNREではないと思うので、私は再開しています。Unityを使用する方法です。 – Will

答えて

1

この

[Dependency] 
public IUnityContainer Container { get; set; } 

のような依存関係プロパティの問題点は、コンストラクタ内で利用できないということです。あなたは、コンストラクタ内にこの値を使用する必要がある場合は、あなたのオブジェクトは、依存関係を持たなければならない場合は、コンストラクタ依存性を一般に

public MainViewModel(IUnityContainer muhContainer, SomeOtherDependency derp) 
{ 
    // use muhContainer and derp here 
} 

を使用し、それはコンストラクタ・インジェクションを介して供給されなければなりません。許容可能なデフォルトを持っているが、実行時にコンフィグレーションで変更したい依存関係がある場合、プロパティの挿入は問題ありません。

[Dependency] 
public Herp WhoCares 
{ 
    get { return _herp ?? _defaultHerpDoesntMatterLol; } 
    set { _herp = value; } 
} 
関連する問題