在较高的层面上,这些如何解决。注射框架有效吗?
如果您始终通过自定义工厂实例化对象,我可以理解:
IUser user = DepInjector.Get<User>();
我猜测会发生什么,无论你在哪里定义映射,它都会查看你想要的类型并尝试找到匹配项,如果找到,它将通过反射实例化类型。
有dep吗?注射。框架可以像:
IUser user = new User();
如果是这样,它将如何获得正确的用户,它在哪里挂钩到CLR来执行此操作?如果是asp.net网站,它有什么不同吗?
答案 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
)在编译的代码中。