1

WinFormsアプリケーション用のMVPベースのGUIアーキテクチャに取り組んでおり、Autofacを使用してさまざまな部分を追跡したいと考えています。私は循環コンポーネントの依存関係に遭遇し続けており、正しい方向に穏やかにプッシュしていただければ幸いです。

アーキテクチャはこの投稿に基づいており、ビューは私が得るのと同じくらい受動的です。ビューには、プレゼンターへの参照はありません。ビューは、構築時にプレゼンターに渡されます。したがって、非DIの世界では、プログラムを次のように開始します。

var MainView = new MainView();
var mainPresenter = new MainPresenter(mainView, new DataRepository());
Application.Run(mainView);

さて、プレゼンターはその仕事をするためにビューインスタンスについて知る必要があります。登録コードでそれをどのように表現できますか?これは私が試したことです:

builder.RegisterType<MainPresenter>().PropertiesAutowired().SingleInstance();
builder.RegisterType<MainView>().As<IMainView>().PropertiesAutowired().SingleInstance();

そして、Program.csで:

var mainPresenter = Container.Resolve<MainPresenter>();
Application.Run(Container.Resolve<IMainView>() as MainView);

ただし、この方法では、Presenterインスタンスを作成することを忘れないでください。ただし、登録で、IMainViewインスタンスを要求した場合、MainPresenterを実行に移す必要があることを表明したいと思います。しかし、どのように....

ヒント、嘲笑、または嘲笑は大歓迎です

4

1 に答える 1

0

この方法で解決できるはずです。ビューはプレゼンターへの参照を必要としないため、プロパティインジェクションなしでプレゼンターとビューを登録します。コンストラクターインジェクションはAutofacのベストプラクティスと見なされます。

builder.RegisterType<MainPresenter>().SingleInstance();
builder.RegisterType<MainView>().As<IMainView>();

コンストラクターを介してビューをプレゼンターに挿入し、読み取り専用プロパティとして公開します。

public class MainPresenter
{
  // Private variables

  private readonly IMainView _view;

  // Constructor

  public MainPresenter(IMainView view)
  {
    _view = view;
  }

  // Properties

  public IMainView View
  {
    get { return _view; }
  }
}

次に、単一の解決策でアプリケーションを起動します。

var mainPresenter = Container.Resolve<MainPresenter>();
Application.Run(mainPresenter.View as Form);

最後に、後でビューからプレゼンターへの参照が必要であることがわかった場合は、循環参照の例外を回避するために、ビューでプロパティインジェクションを使用する必要があると思います。次に、次のようにビューを登録できます。

builder.RegisterType<MainView>().As<IMainView>().PropertiesAutowired(PropertyWiringFlags.AllowCircularDependencies);

Autofacによって設定される読み取り/書き込みプロパティをビューに提供します

public MainPresenter Presenter { get; set; }
于 2012-09-17T20:36:37.083 に答える