Tom*_*m W 6 dependency-injection ninject winforms
我在.net 4中尝试使用winforms应用程序(基本上是草图,我使用它有点像kata,但没有那么严格或具体)的Ninject.
要创建主窗体,我正在执行以下操作:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
[...]
IKernel kernel = BuildKernel();
Application.Run(kernel.Get<frmMain>());
}
static IKernel BuildKernel()
{
var modules = new INinjectModule[]
{
[..modules]
};
return new StandardKernel(modules);
}
}
Run Code Online (Sandbox Code Playgroud)
精细.这将创建一个主窗体并很好地显示它,将适当的接口实现传递给注入的构造函数.
怎么办?我的应用程序是一个MDI,将有几个子窗口用于操作应用程序模型.我不再有对内核的引用了,所以我应该如何处理Get()这些形式?显而易见的答案是"我将内核传递给表单",但这是一个非常混乱的策略,我确信这不符合DI的理念.
我将在此指出Ninject 2的文档很糟糕.我能找到的一切都重复了基本的例子,而没有真正解释使用Ninject的DI如何让事情变得更容易.给出的示例标准并不复杂,不足以使编码和创建模块和绑定的麻烦变得有价值.
编辑#1:
在研究了Sam Holder友情提供的链接后,我正在尝试"组合根"方法.我的架构现在强制它使用的所有表单从CompositedForm构造函数语义派生,因此:
[Inject]
public CompositingForm(ICompositionRoot CompositionRoot)
{
InitializeComponent();
this.CompositionRoot = CompositionRoot;
}
public readonly ICompositionRoot CompositionRoot;
public CompositingForm() : this(new DummyCompositionRoot()) { }
Run Code Online (Sandbox Code Playgroud)
第二个构造函数是为了Forms Designer的好处,除非你提供一个空的构造函数,否则它是愚蠢的并且无法理解表单标记.现在,使用IKernel.Get<AForm>()will(应该)创建的每个表单都有一个组合根注入其中.
所以,因为我是一个缓慢的学习者 - 现在问题是'这个组成根本应该去做什么'?
感谢Jo\xc3\xa3o Almeida和Kellabyte我找到了一种或多或少令人满意的方法:
\n\nIInjectionHeuristic识别该属性的实现;ViewModelLocator将模块加载到 ninject 内核中。| 归档时间: |
|
| 查看次数: |
2937 次 |
| 最近记录: |