Skip to main content

Dependency Injection and Inversion Of Control C# - Par 1 (Concept )

Dependency Injection is one of the SOLI"D" principle which helps to decouple the code by making sure that we should depend on abstractions not in implementation of concrete classes. The concept is Inversion of control.

Inversion Of Control It was considered as a programming style used to invert the flow of control.

In Procedural language a code that consumes dependent code is in control of the process i.e. It knows what exactly what method to use and sometimes most like what the implementation is.

To achieve some goal one class need to consume some other class now question is the consumer class really needs to know about dependency on dependent class ?

It is enough for a consumer class to know the properties, behavior etc. of the dependent class rather than knowing which is the dependent class having those properties, behavior etc..
I mean , we can abstract the behavior which is required to use by a consumer in the dependent class and allowing a consumer class use that instance instead of dependent class directly. In this way consumer class need not to know any specifics about dependent class.

Here B(dependent class) implementing an interface IY and A(consumer class) uses an instance of IY. A using B but it does not know that. A only knows that it uses some class that implements IY, can be A, AB or ABC which implements IY.

Advantage Of IOC:
It provides decoupling, A is not dependent on B. We won't write any code in A which relies on implementation of B hence any on changes in B we won't make any changes in A.

We can change in "A" which implementation of IY it uses without changing anything in A.

Suppose B implements IY interface and used to send email in some format F1 and C is another class that implements IY interface and sends email in another format F2. Suppose A now wants to send email in format F2 rather than format F1. We don't need to modify anything in A.

Another benefit is code isolation in unit testing.
Now A relies on C rather than B because it want to use format F2 instead of format F1 and we don't want our test case to fail.With IoC since  A doesn’t rely on B  but on an implementation of IY that just happens to be B.

Same way in unit testing  we can  change it so that A uses a different implementation of IY, such as a mock object which sends mail in some mock format, and which also allows us to check that A has used it in a correct way.

Now you know the concept, In my next post I will explain this through some exercises.

Dependency Injection in C# - Part 2 (Implementation)

Comments

Popular posts from this blog

Abstract Factory Design Pattern

Abstract Factory : return families of related or dependent objects without specifying their concrete classes. AbstractFactory- IVehicle ConcreteFactory - Maruti, Honda AbstractProduct- IDiesel, IPetrol Product- DezirePetrol, ZenDiesel, AmazeDiesel, CityPetrol Client- This is a class which uses AbstractFactory and AbstractProduct interfaces to create a family of related objects Implementation is pretty much straight forward: Since now you have good understanding of Factory, there is nothing much to explain. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AbstractFactory {     class Program     {         static void Main(string[] args)         {             IVehicle marutiVehicle = new Maruti();             CarClient marutiClient = new CarClient(marutiVehicle); ...

Database Factory Design Pattern C#

Many developers has confusion on how to write database code in application. I will discuss several approaches here and try to provide explanation on each approach. Approach 1 : Easiest approach which is very straight forward which will work absolutely fine. The issues we will get to manage the project in terms of software principles. Like if you going to change Database provider, you would need to change using statements and other issue like mixing Database code with business logic etc. I will not go in detail here, I am assuming you already have an understanding of design principles. I am just exploring different approaches to achieve the database connectivity. using System.Collections.Generic; using System.Data.SqlClient; namespace DatabaseFactory {     class Program     {         static void Main(string[] args)         {             var employees = SomeDabOperation();   ...

Dependency Injection and Inversion Of Control C# - Par 2 (Implementation)

Before going through this post, I suggest you to go through my previous post on basic concepts in Dependency injection and Inversion of control. Demo on product. This demo is based on a traditional implementation approach: We have a Product class and it has a method which takes the discount and based on some business logic it applies the discount on the product. Product service will interact with database using ProductRepository. If you will notice ProductService has dependency on 2 concrete classes i.e. Discount and ProductRepository new Discount(); new ProductRepository(); We can hence say that ProductService is tightly coupled because of these 2 dependencies. We may require to use different discount based on several factors such as Product type, Some Festival or any other factor. Based on different discounts we may need to change ProductService class also in future you may change the database from SQL to Oracle, Again it may require ProductService changes which is viol...