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