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

C#,Ninject:你把内核和模块放在哪里?,c#,ninject,C#,Ninject,我正在创建一个小型C#应用程序,它目前由一个核心程序集和一个winforms程序集组成。我意识到在这样的小事情上我可能真的不需要Ninject,但我想尝试一下 无论如何,要使用Ninject,我知道您将编写一组模块,这些模块映射返回的类,等等。之后,您将创建IKernel的实例,并将模块加载到该实例中 但是,这些模块应该放在哪里?我把内核放在哪里?东西到哪里去了?您可以为内核创建静态包装器类。这样您就可以执行ServiceLocator.Resolve()之类的操作 注册服务有两种方式:内联注册

我正在创建一个小型C#应用程序,它目前由一个核心程序集和一个winforms程序集组成。我意识到在这样的小事情上我可能真的不需要Ninject,但我想尝试一下

无论如何,要使用Ninject,我知道您将编写一组模块,这些模块映射返回的类,等等。之后,您将创建
IKernel
的实例,并将模块加载到该实例中


但是,这些模块应该放在哪里?我把内核放在哪里?东西到哪里去了?

您可以为内核创建静态包装器类。这样您就可以执行ServiceLocator.Resolve()之类的操作

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

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

这些屏幕广播应该让您开始:


    • +1’d马雷克的答案-一定要仔细查看这些资源

      有几点

      即使是在一个小应用程序中,您也绝对可以尝试这一点。认真思考你提出的那些表面上简单的问题也很重要。对于DI来说,你真的需要对它做一些实际的工作才能真正欣赏它——我曾经在“哦,我只有一个小应用”(拒绝)阵营呆了很长一段时间,直到我真正使用它

      有一个学派认为,一般来说,应该远离服务定位器,只进行注入(不依赖于容器)

      如果不使用服务定位器,那么没有人需要知道容器(内核)在哪里,这是最好的

      模块主要用于划分要在特定总体容器(内核)中注册的批处理

      Ninject肯定有一个规范的“全局容器”单例实现?编辑:刚找到一个:-


      另请参见我的观点:正如Marek所说,您应该为内核创建一些(可能是静态的)包装器,其中包含IKernel实例。它应该包含Resolve方法,以及可能的Load(injectmodule)方法-所有静态

      在每个程序集中,您可以简单地定义自己的INinjectModule,该模块映射该程序集中的类

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


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

      我正在寻找一种规范的方法来实现这一点,当我看到你链接了一个模块时,我想“太棒了!”。坏消息是,这段代码非常不线程安全。如果我将内核封装在一个单独的组件中,我可以自己用一种安全的方式(提示,静态构造函数)来完成,但是我要提醒所有将来来到这里的人:链接文章是一个完全不线程安全的实现。@Jimmyhoff我同意它不是线程安全的(建议应用您从中选择的方法)。然而比这好得多的是我的回答的要点,那就是有一个组合根,它有一个可以进行初始化的清晰位置,以完全消除对线程安全(以及其他问题)的需要。我不熟悉你的组合根,但是如果没有对内核的访问,您如何请求要从中注入构造函数的对象呢?在用户界面中,您希望访问
      UserManager
      ,该管理器在构建时使用
      IUserRepository
      ;如何在不访问内核的情况下(通过类似服务定位器的方式)获得
      UserManager
      ?你不能只是
      新建用户管理器(???)并期望将正确的东西交给它的构造函数,可以吗?关于你引用的基本机制仍然需要存在,你是对的。我的意思是,拥有内核并使用容器来访问它,而不是将其视为需要东西的代码,因为。请访问manning.com/seemann——这是一本关于软件体系结构的优秀书籍,您不会后悔购买它(即使它没有直接涵盖Ninject)。