別の解決策は、IoC コンテナーにファクトリーを作成させ、代わりにそれらを注入することです。MVP 実装の例でこの同様の問題を見てください。具体的なビューにはプレゼンターが必要ですが、プレゼンターには IView (抽象化) が必要です。依存関係というより循環参照に似ています。
public interface IView
{
string Name { get; set; }
}
public interface IPresenterFactory<TController>
{
TController Create<TView>(TView view);
}
public class ConcreteView : IView
{
private Presenter _Presenter;
public ConcreteView(IPresenterFactory<Presenter> presenter)
{
this._Presenter = presenter.Create(this);
}
}
public class Presenter
{
public Presenter(IView view)
{
this._View = view;
}
}
プレゼンター ファクトリは、IoC コンテナーを簡単に利用してラップし、必要に応じてファクトリを生成するだけです。IPresenterFactory のモックを作成し、必要なプレゼンターまたはコントローラーを構築するだけで非常に簡単にできるため、単体テストも簡単です。