如何在保持Designer满意的同时将依赖注入应用于UserControl视图?

xof*_*ofz 6 c# user-controls dependency-injection ninject windows-forms-designer

public class StatisticsViewPresenter
{
    private IStatisticsView view;
    private Statistics statsModel;

    public StatisticsViewPresenter(IStatisticsView view, Statistics statsModel)
    {
        this.view = view;
        this.statsModel = statsModel;
    }
}
Run Code Online (Sandbox Code Playgroud)

我不使用事件(但我愿意,如果它可以解决我的问题),所以我的View类看起来像这样:

public class StatisticsForm : Form, IStatisticsView
{
    public StatisticsForm()
    {
        InitializeComponent();
    }

    [Inject]
    public StatisticsViewPresenter Presenter
    {
        private get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

kernel.Bind<StatisticsPresenter>().ToSelf().InSingletonScope();
kernel.Bind<IStatisticsView>().To<StatisticsForm>();
kernel.Get<IStatisticsView>();
Run Code Online (Sandbox Code Playgroud)

它构建表单,构建演示者,然后将演示者注入Presenter属性.一切都很好看.(除了那个单例范围的演示者 - 有关更好的方法的任何想法吗?也许只是手动将演示者注入到演示者的构造函数中的视图的Presenter属性中:this.view.Presenter = this).

但是如果我将StatisticsForm转换为StatisticsUserControl并将其拖放到我的MainForm上,它就不会被Ninject注入到MainForm中,它只是由Designer新设计的.我在这看到三个解决方案:

1)不要使用UserControls,只使用一个实现这些多视图的巨型表单(eww);

2)将UserControls注入我的表单并失去Designer支持;

3)你的解决方案!:)

Pet*_*old 2

我应该说,这无疑是一个有趣的研究领域。我们为自己制定了一个解决方案,以通用形式托管用户控件。

我们的通用表单不适用于设计器。通过代码,我们将所选的用户控件动态添加到表单中。

对于其他框架,您应该查看Microsoft 模式与实践组中的Prism/Composite 。这是一篇讨论 WinForms 扩展的文章。