最近、初めてIoCコンテナーを使い始めましたが、それを使用するためのベスト プラクティスについての教育を受けていません。より具体的には、Unityを C# .NET プロジェクトで使用していますが、 Prismに付属していたので使い始めました。
コンテナを使用して「最上位」オブジェクトを解決すると、コンテナに基づいて注入された正しいオブジェクトが取得されます。ただし、子と子の子を持つオブジェクトがあり、IoC コンテナーからのデータがずっと必要であるが、その間ではない場合、ベスト プラクティスを明確に見ることができません。通常、IoC コンテナーの使用をどのように整理しますか?
最初は、最上位のコンテナーから必要なデータを抽出してこのデータを渡すのではなく、必要な場所にコンテナーを渡すと思います。しかし、注入されたインターフェースに加えて他の特定のデータを取るオブジェクトに到達すると、再び問題が発生します。オブジェクトを解決した後、プロパティまたは init-method を介してこれらを注入したくありません。
これが十分に明確であることを願っていますが、架空の (そして少しばかげた..) 例を見てみましょう。
class Employee
{
private ICommands _commands;
priate List<Customer> _customers = new List<Customer>();
public Employee(ICommands commands)
{
_commands = commands;
}
public void AddCustomer(string customerName)
{
var customer = new Customer(customerName, _commands);
_customers.Add(customer);
}
}
class Customer
{
private string _name;
private ICommands _commands;
priate List<Case> _cases = new List<Case>();
public Customer(string, name, ICommands commands)
{
_name = name;
_commands = commands;
}
public void AddCase()
{
var case = new Case(_commands);
_cases.Add(case);
}
}
class Case {
private ICommands _commands;
public Customer(ICommands commands)
{
_commands = commands;
}
public void TriggerCommands()
{
_command.TriggerSomething();
}
}
したがって、この例はあまり意味がありませんが、本質は、私がしなければならないことと同じです。ViewModel クラスに渡すアプリケーション コマンドがいくつかあります。それらのいくつかは、何かを表示するコマンドをトリガーできる必要があるためです。また、一部のクラスで必要になる可能性がある共通ストレージなどもありますが、現在は中間クラスに渡されて格納されています。コマンドのみの場合、コマンドまたはコンテナを保存しても大したことはありませんが、典型的な IoC の使用法では、代わりに IoC コンテナを渡し、これを後でオブジェクトを解決するために使用しますか? また、顧客名などの特定のデータについてはどうでしょうか? これを Resolve() に渡すことはできないので、後で注入する必要がありますか?
申し訳ありませんが、これは私ができる限り短いものでした。同じ長さの回答は必要ありません;-) ..ただ; IoC コンテナーでこのようなことを行うベスト プラクティスは何ですか?