ninject如何在高级别工作,它如何拦截对象实例化?

时间:2011-05-30 17:03:44

标签: asp.net dependency-injection structuremap ninject

在较高的层面上,这些如何解决。注射框架有效吗?

如果您始终通过自定义工厂实例化对象,我可以理解:

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

我猜测会发生什么,无论你在哪里定义映射,它都会查看你想要的类型并尝试找到匹配项,如果找到,它将通过反射实例化类型。

有dep吗?注射。框架可以像:

IUser user = new User();

如果是这样,它将如何获得正确的用户,它在哪里挂钩到CLR来执行此操作?如果是asp.net网站,它有什么不同吗?

2 个答案:

答案 0 :(得分:8)

如果你想知道Ninject是如何工作的,那么明显的起点就是在他们的官方维基上阅读How Injection Works。它确实使用反射,但它现在也使用动态方法:

  

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

至于你的第二个例子,我不相信有任何DI框架可以满足你的要求。但是,构造函数注入往往是实现IoC的最常用方法,因此在构造类时,它通过某些配置绑定知道要绑定到哪种类型。因此,在您的示例中,IUser将映射到配置绑定中的具体User,以便任何具有IUser参数作为其构造函数的一部分的消费类将获得正确的User传入的类型。

答案 1 :(得分:2)

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