1

IoCと自動配線について気になるのは、作成されたオブジェクトに対するIoCの使いやすさです。

システム全体で使用される静的なUtilsクラスがあるとしましょう。IoCとDIを使用することにしたとき、Utilsを非静的に簡単に変更し、すべてのコンポーネントがそのインスタンスを受け取るようにしました。

ただし、自動配線は、ブートストラップ中に作成されたコンポーネント、実行時またはユーザー操作の応答として作成されたオブジェクト、およびUtilsを使用するオブジェクトに対してのみ適切に機能し、自動配線は機能しません。代わりに、実行時に作成されるすべてのオブジェクトのすべてのインスタンスにUtilsのインスタンスを手動で渡す必要があります。

私が見ることができる唯一の方法は、IoCコンテナを渡すというアンチパターンを使用することですが、これは絶対にやりたくないことです。

別の方法はありますか?または、Utilsをすべてのインスタンスとクラスに手動で渡すことを余儀なくされていますか?

注:これは設計の問題ではありません。もちろん、この比喩的なUtilsの使用をさまざまな方法で最小限に抑えることができますが、多くの場合、それは避けられません。

4

1 に答える 1

3

私が見ることができる唯一の回避策は、IoC コンテナーを渡すアンチパターンを使用することですが、これは絶対にやりたくないことです。

答えは簡単です: 抽象ファクトリを使用します。

アプリケーションでファクトリ インターフェイスを定義し、コンポジション ルート(ブートストラップ コード) でファクトリ実装を定義することで、Service Locator アンチパターンの使用を防ぐことができます。このファクトリー実装は、コンテナーへの参照を保持し、それを呼び出してインスタンスを要求できます。その実装はブートストラップ ロジックの一部であるため、その実装はインフラストラクチャ コンポーネントであり、サービス ロケータとして使用していません

例:

public interface IUnitOfWorkFactory
{
    IUnitOfWork CreateNew();
}

コンポジションルートでの実装:

internal class SimpleInjectorUnitOfWorkFactory
    : IUnitOfWorkFactory
{
    private readonly SimpleInjector.Container container;

    public SimpleInjectorUnitOfWorkFactory(Container container)
    {
        this.container = container;
    }

    public IUnitOfWork CreateNew()
    {
        return this.container.GetInstance<IUnitOfWork>();
    }
}
于 2012-10-18T12:33:26.393 に答える