Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does ninject work at a high level, how does it intercept object instantiation?

At a high level, how do these dep. injection frameworks work?

I can understand if you always instantiate an object via a custom factory like:

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

I'm guessing what happens is, wherever you defined the mappings, it will look at the type you want and try and find a match, if found, it will via reflection instantiate the type.

Are there dep. inj. frameworks that would work like:

IUser user = new User();

If so, how would it get the correct user, where is it hooking into the CLR to do this? In case of an asp.net website, is it any different?

like image 257
Blankman Avatar asked May 30 '11 17:05

Blankman


People also ask

Why Ninject is used?

Ninject is a lightweight dependency injection framework for . NET applications. It helps you split your application into a collection of loosely-coupled, highly-cohesive pieces, and then glue them back together in a flexible manner.

How to implement dependency Injection in c# using Ninject?

Step 1: We are creating an instance of Class StandardKernel. Step 2: Then we will load the Kernel. Step 3: Get the instance of the specific service that we want to inject. Step 4: Then inject the dependency.

What is a ninject module?

The Ninject modules are the tools used to register the various types with the IoC container. The advantage is that these modules are then kept in their own classes. This allows you to put different tiers/services in their own modules.


2 Answers

If you want to know how Ninject works then the obvious place to start would be reading How Injection Works on their official wiki. It does use reflection but it now also uses dynamic methods:

"By default, the StandardKernel will create dynamic methods (via System.Reflection.Emit.DynamicMethod) that can be used to inject values into the different injection targets. These dynamic methods are then triggered via delegate calls."

As for you second example, I don't believe there are any DI frameworks that would do what you ask. However, constructor injection tends to be most common way of implementing IoC, so that when a class is constructed it knows what type to bind to via some configuration binding. So in your example IUser would be mapped to concrete User in config bindings so that any consuming class that has an IUser parameter as part of its constructor would get the correct User type passed in.

like image 150
Dan Diplo Avatar answered Sep 19 '22 05:09

Dan Diplo


AFAIK there's no way to "hook into" object instantiation with the CLR. The only way to use DI in the second case would be to employ an assembly rewriter (i.e. a postprocessor similar to PostSharp) to replace the call to new with a call to the DI factory method (i.e. GetUser) in the compiled code.

like image 44
Ben M Avatar answered Sep 22 '22 05:09

Ben M