我正在创建一个小型 C# 应用程序,它目前由一个核心程序集和一个 winforms 程序集组成。我意识到在这样的小事情中我可能并不真的需要 Ninject,但我想尝试一下。
无论如何,要使用 Ninject,我知道您将编写一组模块,返回映射类等等。之后,您将创建一个实例IKernel
并将您的模块加载到其中。
但是,我在哪里保存这些模块?我在哪里保存内核?东西去哪儿了?
+1'd Marek's answer - 一定要浏览这些资源。
一些点...
即使在一个小应用程序中,你也可以尝试这个绝对是正确的。认真思考像你提出的那些表面上简单的问题也很重要。对于 DI,你真的必须真正地用它做一些工作才能真正欣赏它 - 我在“哦,我只有一个小应用程序”(拒绝)阵营很长一段时间,直到我真正使用它.
有一个学派,一般来说应该远离服务定位器,只进行注入[不依赖于容器]。
如果你不使用服务定位器,没有人需要知道容器(内核)在哪里,这是最好的。
模块主要用于划分批次的事物以在特定的整体容器(内核)中注册。
Ninject 肯定有一个规范的“全局容器”单例实现吗?编辑:刚刚找到一个:- http://www.codethinked.com/creating-a-binding-factory-for-ninject
另请参阅Ninject:如何注入类库?
您可以为内核创建静态包装类。这样你就可以做类似 ServiceLocator.Resolve()
注册服务有两种方式:内联注册和模块注册。它们都应该在引导时加载。模块更适合组织。
也许从 StructureMap 开始会更容易,因为它有静态类并且它具有自动映射功能。
这些截屏视频应该让您开始:
我的观点:正如 Marek 所说,您应该为包含 IKernel 实例的内核创建一些(可能是静态的)包装器。它应该包含 Resolve< T> 方法,并且可能包含 Load(INinjectModule module) 方法 - 都是静态的。
在每个程序集中,您可以简单地定义自己的INinjectModule来映射此程序集中的类。
内核包装器位于“最低”,最常见的程序集(通常是 Log 和 Utils 所在的程序集)。这是因为内核必须可以从所有部分访问 - 所以它必须在程序集中,所有其他部分都引用它。如果你没有,你总是有足够的自由来创建一个。这可能看起来有点棘手,可以预期内核将位于“最高”程序集(可执行程序集)中。不对。
要注册程序集中的所有模块,只需在每个模块中调用 Kernel.Load(new XXModule)。