1

我正在为 WinForms 应用程序开发基于 MVP 的 GUI 架构,并希望使用 Autofac 来跟踪不同的部分。我不断遇到循环组件依赖关系,并希望能在正确的方向上轻轻推动。

该架构基于这篇文章,其中视图就像我得到的一样被动。View 没有对 Presenter 的引用。视图在构建时传递给演示者。因此,在非 DI 世界中,您将开始您的程序:

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

好的,因此 Presenter 需要了解 View 实例才能完成其工作。我如何在注册码中表达这一点?这是我尝试过的:

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 回答