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

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

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

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

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

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

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

那些截屏video应该让你开始:

  • Ninject的Dime Casts系列
  • Dime Cast为StructureMap系列

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

一些要点……

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

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

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

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

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

另请参见Ninject:如何注入类库?

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

在每个程序集中 ,您可以简单地定义自己的INinjectModule ,它映射此程序集中的类。

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

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