4

Unity ServiceLocator を介して解決したい ViewModel クラスがありますが、viewModel にはコンストラクターへのパラメーターが必要です。パラメータの型は、一部のサービス実装ではなく、アプリケーション (Customer オブジェクト) のエンティティの 1 つです。Unitycontainer 自体に対するコーディングで、次のようなパラメーターを渡すことができることを知っています。

 _container.Resolve<CustomerDetailViewModel>(new ParameterOverrides {{"customer", customer}});

ただし、コンテナーに直接アクセスできない場合は、次のように ServiceLocator を経由する必要があります。

(CustomerDetailViewModel)ServiceLocator.Current.GetInstance<CustomerDetailViewModel>();

ただし、2 番目のアプローチを使用すると、ServiceLocator にパラメーターを渡す方法がありません。これを行う方法はありますか?ServiceLocator から Container のインスタンスを取得してそれを使用するのは「間違っている」のでしょうか?

4

2 に答える 2

4

Customer問題は、エンティティ (この場合) をクラスに注入しようとしていることです。エンティティは短命のオブジェクトであり、注入される対象として適していない傾向があります。

を注入する代わりに、サービスCustomerを注入しICustomerRepositoryます。アプリケーションのスタートアップ パスに実装を登録するICustomerRepositoryと、コンテナーを直接呼び出す必要がなくなります。これにより、アプリケーションの設計がより簡潔になり、単体テストがより簡単になります。

于 2011-03-15T11:09:20.017 に答える
0

ServiceLocator のラッパーを作成すると、ラッパー内に unity コンテナーを保持し、ParameterOverrides プロパティを受け取る追加の解決メソッド オーバーロードを公開できます。次に、メソッドは Unity コンテナーを使用して、ServiceLocator コード スニペットではなく、最初のコード スニペットに従って解決を行うことができます。

于 2011-05-18T02:28:53.237 に答える