2009-11-04 129 views
9

我正在创建一个小小的C#应用​​程序,它目前由一个核心程序集和一个winforms程序集组成。我意识到我可能不需要Ninject这样的小事情,但我想尝试一下。C#,Ninject:你把内核和你的模块放在哪里?

反正,与Ninject一起工作我已经理解你会写一组模块,这些模块会返回映射类,等等。之后,您将创建一个IKernel的实例并将您的模块加载到该实例中。

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

回答

3

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

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

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

那些截屏应该让你开始:

3

+1马立克氏答案 - 绝对通过这些资源的样子。

几点......

你是绝对正确的去尝试这一点,即使在一个小应用程序。认真思考诸如你所提出的那些简单的表面问题也很重要。对于DI来说,你真的必须真正做一些工作才能真正感谢它 - 我一直在“哦,我只有一个小应用程序”(拒绝)阵营很长一段时间,直到我真正使用它。

虽然有一所学校虽然一般应该远离服务定位器,只是注射[没有任何对容器的依赖]。

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

模块主要用于划分批次的事物以在特定的整体容器(内核)中进行注册。

当然,Ninject有一个规范的'Global Container'Singleton实现吗?编辑:刚刚发现一个: - http://www.codethinked.com/creating-a-binding-factory-for-ninject

参见Ninject: How do I inject into a class library?

+0

我只是想找一个规范的方式来做到这一点,并认为“太棒了!”当我看到你链接一个。坏消息,该代码是TERRIFICALLY UNTHREADSAFE。如果我将内核包装在一个单例中,我可以以一种安全的方式(提示,静态构造函数)自己做到这一点,但要警告未来所有的人:链接文章是一个完全不是线程安全的实现。 – 2013-01-25 18:01:22

+0

@JimmyHoffa我同意它不是线程安全的(建议从http://csharpindepth.com/articles/general/singleton.aspx应用您选择的方法)。然而,远远好于我的回应的主要观点,即有一个组合根,它有一个明确的位置,可以进行初始化,以便将此线程安全性(以及其他问题)的需要排除在图像之外完全。 – 2013-01-25 18:28:15

+0

我不熟悉你的组合根,但没有访问内核,你如何请求你想要构造函数注入的对象?在你的用户界面中,你需要访问你的'UserManager',它在构造时需要'IUserRepository';你如何在不访问内核的情况下获取UserManager'(通过类似服务定位器的东西)?你不能只是'新的UserManager(???);'并且期望正确的东西被交给它的构造函数吗? – 2013-01-25 19:46:40

0

我的观点:如马立克说,你应该为内核,它包含的iKernel例如一些(可能是静态的)包装。它应该包含Resolve < T>方法,并且可能包含Load(INinjectModule模块)方法 - 全部是静态的。

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

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

要注册组件中的所有模块,只需在每个模块中调用Kernel.Load(new XXModule)。