C#,Ninject:你把内核和模块放在哪里?
我正在创建一个小型C#应用程序,它目前由一个核心程序集和一个winforms程序集组成。我意识到在这样的小事情上我可能真的不需要Ninject,但我想尝试一下 无论如何,要使用Ninject,我知道您将编写一组模块,这些模块映射返回的类,等等。之后,您将创建C#,Ninject:你把内核和模块放在哪里?,c#,ninject,C#,Ninject,我正在创建一个小型C#应用程序,它目前由一个核心程序集和一个winforms程序集组成。我意识到在这样的小事情上我可能真的不需要Ninject,但我想尝试一下 无论如何,要使用Ninject,我知道您将编写一组模块,这些模块映射返回的类,等等。之后,您将创建IKernel的实例,并将模块加载到该实例中 但是,这些模块应该放在哪里?我把内核放在哪里?东西到哪里去了?您可以为内核创建静态包装器类。这样您就可以执行ServiceLocator.Resolve()之类的操作 注册服务有两种方式:内联注册
IKernel
的实例,并将模块加载到该实例中
但是,这些模块应该放在哪里?我把内核放在哪里?东西到哪里去了?您可以为内核创建静态包装器类。这样您就可以执行ServiceLocator.Resolve()之类的操作 注册服务有两种方式:内联注册和模块注册。它们都应该在引导时加载。模块更适合组织 也许从StructureMap开始会更容易,因为它有静态类,并且具有自动映射功能 这些屏幕广播应该让您开始:
- +1’d马雷克的答案-一定要仔细查看这些资源
有几点
即使是在一个小应用程序中,您也绝对可以尝试这一点。认真思考你提出的那些表面上简单的问题也很重要。对于DI来说,你真的需要对它做一些实际的工作才能真正欣赏它——我曾经在“哦,我只有一个小应用”(拒绝)阵营呆了很长一段时间,直到我真正使用它
有一个学派认为,一般来说,应该远离服务定位器,只进行注入(不依赖于容器)
如果不使用服务定位器,那么没有人需要知道容器(内核)在哪里,这是最好的
模块主要用于划分要在特定总体容器(内核)中注册的批处理
Ninject肯定有一个规范的“全局容器”单例实现?编辑:刚找到一个:-
另请参见我的观点:正如Marek所说,您应该为内核创建一些(可能是静态的)包装器,其中包含IKernel实例。它应该包含Resolve
要从程序集中注册所有模块,只需在每个模块中调用Kernel.Load(new XXModule)。我正在寻找一种规范的方法来实现这一点,当我看到你链接了一个模块时,我想“太棒了!”。坏消息是,这段代码非常不线程安全。如果我将内核封装在一个单独的组件中,我可以自己用一种安全的方式(提示,静态构造函数)来完成,但是我要提醒所有将来来到这里的人:链接文章是一个完全不线程安全的实现。@Jimmyhoff我同意它不是线程安全的(建议应用您从中选择的方法)。然而比这好得多的是我的回答的要点,那就是有一个组合根,它有一个可以进行初始化的清晰位置,以完全消除对线程安全(以及其他问题)的需要。我不熟悉你的组合根,但是如果没有对内核的访问,您如何请求要从中注入构造函数的对象呢?在用户界面中,您希望访问
UserManager
,该管理器在构建时使用IUserRepository
;如何在不访问内核的情况下(通过类似服务定位器的方式)获得UserManager
?你不能只是新建用户管理器(???)代码>并期望将正确的东西交给它的构造函数,可以吗?关于你引用的基本机制仍然需要存在,你是对的。我的意思是,拥有内核并使用容器来访问它,而不是将其视为需要东西的代码,因为。请访问manning.com/seemann——这是一本关于软件体系结构的优秀书籍,您不会后悔购买它(即使它没有直接涵盖Ninject)。