inversion of control and dependency injection

Post on 25-May-2015

2.124 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

This slide describes that how Dependency injection works for MVC 4 Web API.

TRANSCRIPT

Inversion of control and

Dependency Injection

By Dinesh Sharma

Aware of MVC Framework Aware of Web API

Assumption

Inversion of Control, or IoC, is an abstract principle describing an aspect of some software architecture designs in which the flow of control of a system is inverted in comparison to procedural programming.

It means, that in procedural programming a chunk of code that uses, or consumes, another chunk of code is in control of the process.

What is Inversion of Control (IoC) principle ….

Dependency Injection is a great way to reduce tight coupling between software components.

Instead of hard-coding dependencies, such as specifying a database driver, you inject a list of services that a component may need. The services are then connected by a third party.

This technique enables you to better manage future changes and other complexity in your software.

What is Dependency Injection

The greatest benefit is that it encourages dependency free architecture. Your classes stand alone, and do not depend on a specific implementation (other than it's interface and requirements)

Flexibility to use alternative implementation of a given service without recompiling the application code.

IoC container can control the lifetime of your dependencies. Suppose you want an object to exist for the lifetime of the request in web page.

Why Dependency Injection…

Continue……

Code becomes more reusable, testable and readable.

When you test something, if it has a hard coded new in there, you can't easily replace it with a mocked object to feed it test data. Suppose you want to test that an object calculates a value correctly. Feeding it test data with known values makes it easier to test.

Why …..

We can inject ◦ Controllers◦ Views◦ Constructors◦ Filters

Where can be used for an MVC application….

Unity (Microsoft Enterprise Library block) Ninject Castle Windsor Autofac StructureMap Spring.Net Etc…….

IoC Containers

We have Products API, which implement the Products repository. So we need to create an object of Product Repository to access its functionality into API.

Applying IoC – A Scenario

Products APIProducts

Repository

public class EmployeeController : ApiController { private readonly EmployeeRepository repository;

public EmployeeController() { repository = new EmployeeRepository();……………

If we create the interface for ProductRepository then we

can hide our implementation as below –

Applying IoC – A Scenario

public class ProductsController : ApiController { private readonly IProductRepository repository;

public ProductsController() {

this.repository = new ProductRepository(); }

Employee API

Employee Repository

IEmployee Repository

In this scenario still we need to look into the implementation of ProductRepository.

How to avoid dependency of ProductRepository?

Let’s inject the Dependency using IoC (Unity)

Applying IoC – A Scenario

Create MVC 4 WebAPI project Using NuGet install package for Unity

◦ Install-package Unity Configure IoC Container (as in coming up

slides)

and ready to Go…….

How to start…..

IoC container implements the Scope container and IDependencyResolver interface, which required to implement the BeginScope() method as below -

class IoCContainer : ScopeContainer, IDependencyResolver

{

public IoCContainer(IUnityContainer container) : base(container)

{

}

//Creates a nested scope.

public IDependencyScope BeginScope()

{

var child = container.CreateChildContainer();

return new ScopeContainer(child);

}

}

Create IoC Container class…

Now, Let’s write the ScopeContainer class, which implements the IDependencyScope interface. IDependencyScope having two methods GeteService() and GetServices(),

These two methods are responsible to create the object of dependent class.

Create IoC Container class…

class ScopeContainer : IDependencyScope { protected IUnityContainer container;

public ScopeContainer(IUnityContainer container) { if (container == null) { throw new ArgumentNullException("container"); } this.container = container; }

Implementation…

Continued…

//Creates one instance of a specified typepublic object GetService(Type serviceType){

if container.IsRegistered(serviceType)) {

return container.Resolve(serviceType);}else

{return null;

}}

Implementation…

Continued…

//Create a collection of objects of a specified type public IEnumerable<object> GetServices(Type serviceType) { if (container.IsRegistered(serviceType)) { return container.ResolveAll(serviceType); } else { return new List<object>(); } }//Once process is done container dispose the objects public void Dispose() { container.Dispose(); }

Implementation…

Let’s create the container and register our dependencies to this –

void ConfigureApi(HttpConfiguration config){

var unity = new UnityContainer();unity.RegisterType<EmployeeController>();unity.RegisterType<IEmployeeRepository,

EmployeeRepository>(new HierarchicalLifetimeManager());config.DependencyResolver = new

IoCContainer(unity);}

Initial calls…

Now inject the Dependency, which is EmployeeRepository here…….

public class EmployeeController : ApiController { private readonly IEmployeeRepository repository;

public EmployeeController(IEmployeeRepository repository ) { if (repository == null) { throw new ArgumentNullException("repository"); } this.repository = repository; }

All set….. Let’s implement

Inversion of control and

Dependency Injection

By Dinesh Sharma

top related