如何使用IoC创建Winforms Generic Presenter Factory

时间:2016-04-18 05:00:25

标签: c# winforms generics simple-injector

我正在使用MVP设计模式创建Winforms应用程序。目前,我创建了一个视图,然后在视图的构造函数中,我为视图注入了演示者。但是,为了使用IoC容器,我必须打破视图和演示者之间的依赖关系循环。我的情况与此类似:link

然而,不同之处在于我的主要表单有多个演示者。所以,我正在尝试建立一个演示者工厂,我可以更具体地指定一个presenter接口类型,在其上创建一个演示者实例。而且,我希望工厂能够设置演示者的视图属性。我对仿制药有点新意,所以我在这里失败了一点。到目前为止,这是我失败的代码:

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

public static class PresenterFactory
{
    private static Container _container;

    public static void RegisterContainer(Container container)
    {
        _container = container;
    }

    public static IPresenter<TView> CreatePresenterForView<TPresenter, TView>(TView view)
        where TPresenter : IPresenter<TView>
    {
        var presenter = _container.GetInstance<TPresenter>();
        presenter.View = view;
        return presenter;
    }
}

错误来自我试图从容器中获取实例的地方。它说TPresenter必须是引用类型才能将其用作参数。

有关该怎么做的任何建议?

编辑(回答一个问题,为什么我有一个视图的多个演示者):嗯,这是一个很好的问题,我不相信我的答案。我有一个很大的主要形式,有很多功能,但我想在一个屏幕上的所有功能。值得庆幸的是,功能可以松散地分为相关区域。因此,为了管理视图的复杂性,我创建了一堆部分类文件,每个文件专用于一个功能区域(比如我有5个功能区域)。我还为视图的每个功能区域都有一个界面。基本上,在每个部分类文件中,我实现了一个接口:

partial class MainView : Form

partial class MainView : IMainViewFunctionalArea1

我的计划是为每个功能区域设置一个单独的演示者,每个演示者都可以通过界面引用MainView:

class PresenterMainViewFunctionalArea1
{
    IMainViewFunctionalArea1 view;

    ...
}

是的,我意识到这与我发布的初始代码不符。但是,嘿,我正在学习!我们的想法是,这样可以通过这种方式将测试分开来简化测试。演示者只有与其功能区域相关的方法,视图界面只会暴露相关的东西。

所有这一切,我现在正在考虑只有一位主持人会是什么感觉,可能与我的观点分开。演示者可以为所有功能区域实现接口,然后可以根据使用的接口简化测试。

我可以在这里使用一些指导!

0 个答案:

没有答案