如何组织MVP与IoC容器?(How to organize MVP with an IoC con

2019-07-30 16:23发布

我试图让IoC的概念来与WinForms应用程序。 说我有一个演示其构造函数采用其观点和构造函数的参数的服务。 所以在形式的代码,我有一些达这样的:

mnPresenter = new Presenter(this, new AppService());

在那里,说是AppService服务的IAppService的实现。 它注册在我的[autofac] IoC容器。 是什么让“新”出这个主持人建设的建议呢? 没有使用IoC框架就像我上面做失去这些“新”的呼叫整点?

我可以做类似

mPresenter = new Presenter(this, MyContainer.Resolve<IAppService>())

但似乎打败的IoC的目的。 我可能丢失的东西在这里根本。

提前道歉,如果我失去了一些东西明显。

Answer 1:

你的问题是,有观点和演示之间的依赖关系循环,因为他们彼此依赖。 打破这种依赖循环的一般规则是退却到财产注入,这会在你的情况下正常工作。

随着MVP,最好是让视图通过将其注入演示的属性分配自己创建的演示:

mPresenter = container.Resolve<Presenter>();
mPresenter.View = this;

如果可以的话,隐藏应用程序的容器。 由于您使用的MVP,只是你永远需要直接解决的事情是主持人。 因此,与其让形式与集装箱沟通,让他们有一个静态的沟通PresenterFactory 。 该工厂将使用容器盖下:

mPresenter = PresenterFactory.Create<MyPresenter>();
mPresenter.View = this;

PresenterFactory可能是这样的:

public static class PresenterFactory
{
    private static IContainer container;

    public static TPresenter Create<TPresenter>()
        where TPresenter : IPresenter
    {
        return (TPresenter)
            container.Resolve(typeof(TPresenter));
    }

    public static void SetContainer(IContainer container)
    {
        PresenterFactory.container = container;
    }
}

和你的作文根可能是这样的:

static void Main()
{
    Bootstrap();
}

private static void Bootstrap()
{
    var builder = new ContainerBuilder();
    // TODO: register presenters

    var container = builder.Build();

    PresenterFactory.SetContainer(container);
}

UPDATE

或许更重要的它是做这样的事情:

interface IPresenter<TView>
{
    TView View { get; set; }
}

public static class PresenterFactory
{
    private static IContainer container;

    public static IPresenter<TView> CreateForView<TView>(TView view)
    {
        var presenter = container.Resolve<IPresenter<TView>>();
        presenter.View = view;
        return presenter;
    }
}

// View
mPresenter = PresenterFactory.CreateForView(this);

这隐藏实际执行从视图中呈现的和集中的视图到演讲者的注册。



Answer 2:

你需要的属性在主持人

public IAppService service;

它将由容器注入,你并不需要把它作为参数传递。 你所写的是一个服务定位器,实际上是一种反模式为510C。

如果您的看法是强类型并与容器注册过,你可以使用Autofac和财产.SingleInstance生命周期

public IMyView view;

在您的介绍,容器会再注入视图实例到您的主持人。

你基本上看代码另一个问题: 注册一个演示了查看



文章来源: How to organize MVP with an IoC container?