Inversion Of Control & Dependency Injection Break Apart The Dependencies Oren Eini Senior Developer...

43
Inversion Of Control & Dependency Injection Break Apart The Dependencies Oren Eini Senior Developer We! Consulting Group http://www.ayende.com/ Blog/

Transcript of Inversion Of Control & Dependency Injection Break Apart The Dependencies Oren Eini Senior Developer...

Inversion Of Control& Dependency Injection

Break Apart The DependenciesOren EiniSenior DeveloperWe! Consulting Grouphttp://www.ayende.com/Blog/

Who wants to try to move that?

What can we do about it?

Who am I and what I do?• Senior Developer at We!• Mostly dealing with complex business

applications• 100% of current projects using IoC• Blogger - ~95,000 visits / month– Object Relational Mapping– Inversion Of Control– Model View Controller architectures for the web– Various Development topics

Lazy

Developer

What it is – Architecture?

• Decreased Coupling• Greater Flexibility• Separation of Concerns • Interface Driven Design • Dependency Management (via Dependency

Injection or Service Lookup) • Component Oriented Programming

Reduced Cost Of Change

What is it – Technology?

• (Very) smart factory• Automatic resolving and injection of

dependencies

A bit about terminology

• Container• Service / Component• Inversion of Control• Dependency Injection

What is the problem we are trying to solve?

• To understand the solution, we need to understand what the problem is…

LET US HAVE A PIZZA…

The Pizza Process

Coupled Pizza Place

Client Code

Customer customer = new Customer("Fred");

CoupledPizzaPlace pizzaPlace = new CoupledPizzaPlace();

pizzaPlace.MakeOrder(customer,3);

Coupled Pizza Place•Clerk knows about cook•Deliveries service knows about clerk•Cook knows about clerk

HELP THE COOK TRADE JOBS.

HELP THE CLERK TAKE VACATION.

Coupled Pizza Place

Decoupled Pizza PlaceJust put some

interfaces…

Decoupled Client CodeOven oven = new Oven();

MakePizzaCook takePizzaFromOvenCook = new MakePizzaCook(oven);

OrdersClerk ordersClerk = new OrdersClerk(takePizzaFromOvenCook);

MakeDevliveriesService makeDevliveriesService = new MakeDevliveriesService(ordersClerk);

TakePizzaFromOvenCook makePizzaCook = new TakePizzaFromOvenCook(oven, ordersClerk);

DecoupledPizzaPlace pizzaPlace =

new DecoupledPizzaPlace(takePizzaFromOvenCook, ordersClerk, makeDevliveriesService, makePizzaCook);

Customer customer = new Customer("Fred");

pizzaPlace.MakeOrder(customer,3);

Into Factory Method

DecoupledPizzaPlace pizzaPlace =

DecoupledPizzaPlace.Create();

Customer customer = new Customer("Fred");

pizzaPlace.MakeOrder(customer, 3);

Did we really lower the cost of change?

Decoupled Pizza Place

IoC Pizza Place

IoC Client Code

IoC.Initialize(new RhinoContainer("Pizza.boo"));

Customer customer = new Customer("Fred");

IoCPizzaPlace pizzaPlace = IoC.Resolve<IoCPizzaPlace>();

pizzaPlace.MakeOrder(customer, 3);

pizzaPlace.DoWork();

Configuration(later)

When Application Starts

Configuring IoC: Using DSLComponent("sara", IClerk, OrdersClerk)Component("nissim", ICook, MakePizzaCook)Component("moshe", IMakeDeliveries,

MakeDeliveriesService)Component("nir", ICook, TakePizzaFromOvenCook)Component("oven", Oven)Component("pizza", IoCPizzaPlace,

secondCook: @nir)

Yes, you can do it with XML as

well…

IoC.Resolve<IoCPizzaPlace>();

IClerk

IMakeDeliveries

ICook

ICook

ICook

IClerk

IClerk

Oven

Second Cook

√√ √ √

√√

Inversion Of Control Container

• All the services in theapplication are registered in the container.

• Single point of access to all the services in the application.

• Automatically resolves all the dependencies of services registered with the container.

• Neither the client nor the service are tied to the dependencies.

Benefits of IoC

• Dependencies are managed for you.• Highly focused objects (single responsibility,

separation of concerns).• Testability.• Objects are not coupled directly to

environment resources or other unintended implementations

Why not do it myself?

Managing dependencie

s automaticall

y

Managing dependencies in a single

place

Managing life cycle for all objects

Easy Customizatio

n

Flexibility…Component("sara", IClerk,

OrdersClerk)

Component("nissim", ICook, MakePizzaCook)Component("moshe", IMakeDeliveries,

MakeDeliveriesService)Component("nir", ICook, TakePizzaFromOvenCook)Component("oven", Oven)Component("pizza", IoCPizzaPlace,

secondCook: @nir);

TempClerk;)

cook: @nir, secondCook: @nissim)

,cook: @nir;)

And in the real world…

• Changing the payment service: PayPal Credit Card

• Changing the delivery service: UPS FedEx• Changing a database• Replacing validation rules

ADVANCE STUFF:EXPLODING HEADS ZONE

Generic Services

Usage://from databaseIoC.Resolve<IRepository<Customer>>

.Get(1337);//from active directoryIoC.Resolve<IRepository<User>>

.Get(42);

Configuration

Component("users_repository", IRepository of User, ActiveDirectoryRepository)

Component("database_repository", IRepository, NHibernateRepository)

Generic SpecializationUsage:IoC.Resolve<IRepository<User>>

.Get(5);IoC.Resolve<IRepository<Customer>>

.Get(15);

A word about decorators

Client code…

Configuration

Component("logging_users_repository", IRepository of User, LoggingDecorator of User,

inner: @users_repository)

Component("logging_ database _repository", IRepository, LoggingDecorator,

inner: @database_repository)

Component("users_repository", IRepository of User, ActiveDirectoryRepository)

Component("database_repository", IRepository, NHibernateRepository)

Other uses of Inversion of Control Containers

• Manage lifetime of services (singleton, transient, per request, etc).

• Aspect Oriented Programming• Decorators

Pros• Simpler Architecture• Reduced cost of change• Encourage best practices• Interface driven design and component oriented

programming• Less work• More smarts from the framework

Cons

• Need to learn• Higher level of abstraction• Misuse of architecture

Resources

• Inversion of Control Containers and the Dependency Injection pattern – Martin Fowler

• The Dependency Injection Principal - Robert C. Martin• Inversion of Control and Dependency Injection: Working with

Windsor Container – Oren Eini

Questions?

Come to meet me at the Architecture & Developers

Panels or visit my blog:http://www.ayende.com/Blog

המשוב שלכם

! לנו חשוב

למלא} לשכוח לאכל על מסכם משוב

היום! {

המשוב שלכם

! לנו חשוב

Thank You!