【发布时间】:2016-03-04 17:20:02
【问题描述】:
我不得不重新编写一个大型 WinForms 应用程序,我想使用 MVC 来增加测试能力等。我还想采用 Ninject 作为我的 IoC 容器,因为它轻量级、快速并且会增加我的可扩展性应用程序向前。
我已经阅读了大量内容,并设法开始了解这个新应用程序的架构。但是,我不确定在使用 Ninject 时我的想法是否正确。代码...
从 Program.cs 和相关类开始...
static class Program
{
[STAThread]
static void Main()
{
FileLogHandler fileLogHandler = new FileLogHandler(Utils.GetLogFilePath());
Log.LogHandler = fileLogHandler;
Log.Trace("Program.Main(): Logging initialized");
CompositionRoot.Initialize(new ApplicationModule());
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(CompositionRoot.Resolve<ApplicationShellView>());
}
}
public class CompositionRoot
{
private static IKernel _ninjectKernel;
public static void Initialize(INinjectModule module)
{
_ninjectKernel = new StandardKernel(module);
}
public static T Resolve<T>()
{
return _ninjectKernel.Get<T>();
}
}
public class ApplicationModule : NinjectModule
{
public override void Load()
{
Bind(typeof(IApplicationShellView)).To(typeof(ApplicationShellView));
}
}
我的ApplicationShellView 是
public partial class ApplicationShellView : Form, IApplicationShellView
{
public ApplicationShellView()
{
InitializeComponent();
}
public void InitializeView()
{
dockPanel.Theme = vS2012LightTheme;
}
}
带接口
public interface IApplicationShellView
{
void InitializeView();
}
这个视图的控制器是
public class ApplicationShellController
{
private IApplicationShellView view;
public ApplicationShellController(IApplicationShellView view)
{
view.InitializeView();
}
}
目前控制器是多余的,虽然这段代码有效并且我的视图显示,但我有一些重要的问题......
- 我应该使用
ApplicationShellController来初始化我的表单吗,目前这不使用MVC“模式”? - 感觉就像我写了一个服务定位器,从我读到的内容来看,这很糟糕。我还应该如何使用 Ninject for IoC 来初始化我的应用程序?
- 关于我做的对[如果有的话!]/错的任何其他建议?
非常感谢您的宝贵时间。
【问题讨论】:
-
我认为这个/类似的问题之前被问过,特别是关于“服务定位器”。一般来说,这个问题是/应该更多关于如何使用 WinForms 结合任何 DI 容器进行 MVC...
-
这不是一个通用问题。这是一个关于具体情况的问题。你怎么能说它以前被问过?我的问题不是专门针对服务定位器,而是如何将 MVC 与 IOC 容器耦合。
-
您能否举例说明如何在没有 DI 的情况下在 ApplicationShellView 中使用其他表单或服务? (我对winforms没有经验,我应该看看生活管理)。
-
所以我的意思是我认为这个问题最困难的部分是如何将 MVC + DI-container 与 winforms 结合起来(无论使用哪个 DI 容器)。我认为已经存在涉及这方面的问题。 ninject 特定的部分非常小,我很乐意为您提供帮助。但与@MaDeRkAn 一样,我对 WinForms 的了解还不够。
-
this 怎么样?
标签: c# winforms model-view-controller ninject inversion-of-control