2011-05-30 20 views
5

在高层次上,这些dep如何进行。注入框架的工作?ninject如何在高层次上工作,它如何拦截对象实例?

我能理解,如果你总是通过自定义工厂实例化一个对象,如:

IUser user = DepInjector.Get<User>(); 

我猜会发生什么情况是,无论你定义的映射,它会看着你想要的类型,并尝试并找到一个匹配,如果找到,它会通过反射实例化类型。

是否有dep。注射。这工作就像框架:

IUser user = new User(); 

如果是这样,怎么会得到正确的用户,在那里它钩住CLR做到这一点?在asp.net网站的情况下,它有什么不同?

回答

8

如果你想知道Ninject的工作方式,那么明显的地方就是在他们的官方wiki上阅读How Injection Works。它使用了反射,但现在也使用动态方法:

“默认情况下,StandardKernel将 创建动态的方法(通过 System.Reflection.Emit.DynamicMethod) 可用于将值注入 不同的注射目标这些。 然后通过 委托调用触发动态方法。“

至于你的第二个例子,我不认为有任何DI框架可以做你所要求的。然而,构造函数注入往往是实现IoC的最常见方式,所以当构造一个类时,它知道通过某种配置绑定绑定的类型。所以,在你的榜样IUser将被映射到具体User在配置绑定,以便任何消费类,它具有一个IUser参数作为它的构造会得到正确的User类型传入的一部分。

+1

+1不过我倒是[链接这个](https://github.com/ninject/ninject/wiki/Dependency-Injection-With-Ninject)这就解释了OP没有任何魔术可以直接相当 – 2011-06-12 01:00:28

2

AFAIK没有办法与CLR“挂钩”对象实例化。在第二种情况下使用DI的唯一方式是使用组装重写器(即类似于PostSharp的后处理器)以在编译的代码中调用DI工厂方法(即,GetUser)来代替new的呼叫。