C#,Ninject:你把内核和模块放在哪里?

时间:2009-11-04 19:09:51

标签: c# ninject

我正在创建一个小型的C#应用​​程序,它目前包含一个核心程序集和一个winforms程序集。我意识到我可能并不真的需要像这样的小东西Ninject,但我想尝试一下。

无论如何,与Ninject一起工作我已经明白你会写一组模块,返回map类,等等。之后,您将创建一个IKernel实例并将模块加载到该实例中。

但是,我在哪里保留这些模块?我在哪里保留内核?什么东西去了?

3 个答案:

答案 0 :(得分:3)

您可以为内核创建静态包装类。这样你就可以做像ServiceLocator.Resolve()

这样的事情

对于注册服务,有两种方式:内联和模块注册。它们都应该在bootstrapping时加载。模块更适合组织。

也许从StructureMap开始会更容易,因为它有静态类,并且它具有自动映射功能。

那些截屏视频应该让你开始:

答案 1 :(得分:3)

马立克的答案+1了 - 绝对可以浏览这些资源。

有些观点......

即使在一个小应用程序中,你也可以尝试这样做。同样重要的是要仔细思考表面上简单的问题,比如你提出的问题。对于DI,你真的必须真正做一些工作来真正欣赏它 - 我一个人在“哦,我只有一个小应用程序”(拒绝)阵营很长一段时间,直到我实际使用它

虽然有一个学校,但一般应该转向服务定位器,只是注射[没有任何依赖于容器]。

如果你不使用服务定位器,没有人需要知道容器(内核)的位置,这是最好的。

模块主要用于划分批量事物以在特定的整体Container(内核)中注册。

肯定有一个规范的'全球集装箱'单身人士实施Ninject吗?编辑:刚刚找到一个: - http://www.codethinked.com/creating-a-binding-factory-for-ninject

另见Ninject: How do I inject into a class library?

答案 2 :(得分:0)

我的观点:正如Marek所说,你应该为内核创建一些(可能是静态的)包装器,它包含IKernel实例。它应该包含Resolve< T>方法,可能还有Load(INinjectModule模块)方法 - 全静态。

在每个程序集中,您只需定义自己的 INinjectModule 即可映射此程序集中的类。

内核包装器位于“最低”,最常见的程序集(通常是Log和Utils所在的程序集)。这是因为内核必须可以从所有部分访问 - 因此它必须在程序集中,所有其他部分都可以引用它。如果你没有,你总是有足够的自由来创建一个。这可能看起来有点棘手,可以预期内核将处于“最高”程序集(可执行程序集)中。不对。

要从程序集中注册所有模块,只需在每个模块中调用Kernel.Load(new XXModule)。