In this tutorial, You will learn about how to implement Dependency Injection in Asp.net MVC using Microsoft Unity plugin. In previous tutorial we learned about how to add Business Layer and Domain Layer. Lets look at below layers and get little idea about what is the use of them.
1. Web Layer is your MVC web Project
2. Business Layer consist the CRUD operation, gets data from Data Access Layer, Manipulate them and finally returns data to the Controller ( Web Layer)
3. Domain Layer consist the Domain Models or Classes that hold the data coming from Data Access Layer. Both Web and Business Layer can use domain models to exchange data.
4. Data Access Layer consist the generic repository methods (generic CRUD operation), Unit of Work( Database Context) and NON Generic repository( User defined repository).
# What is Dependency Injection?
Dependency Injection is a software design pattern that help us to develop loosely coupled code.
Loose coupling offers below advantages
Dependency Injection is a software design pattern that help us to develop loosely coupled code.
Loose coupling offers below advantages
- Increases code “Reusability”
- Improves code “Maintainability”
- Improves “Testability”
We might have seen in a big project , several sets of developer working on different modules . It would be a great idea if they can work independently without effecting other's work.
Generally, we have dependency on object of a class that creates a tightly coupled architecture.
For example, we have a class in our Business Layer and it consist some methods. Now if I create the instance of this class into my Web Layer's controller then, both Business and Web Layer will be tightly coupled.
Our basic idea of using dependency injection is to remove dependency from our persistence resource like entity framework.
# What are the ways to implement Dependency Injection?
we can use any of the following way
- Constructor Injection
- Property/Setter injection
- Method injection
# Steps to implement Dependency Injection using Microsoft Unity?
Step 1 : Right Click on your solution and click on Manage NuGet Package
Step 3 : After installing plugin, a config file(UnityConfig.cs) will be created in your AppConfig Folder. Open that file and add below setting into this.
Copy "container.RegisterType<IEmployeeBusiness, EmployeeBusiness>();" in your UnityConfig.cs file. I expecting, you already have watched my previous tutorial i.e How to add Business Layer and Domain Layer in MVC. Copy
using MVCTutorial.Business; using MVCTutorial.Business.Interface; using MVCTutorial.Infrastructure; using System.Web.Mvc; using Unity; using Unity.Injection; using Unity.Mvc5; namespace MVCTutorial { public static class UnityConfig { public static void RegisterComponents() { var container = new UnityContainer(); // register all your components with the container here // it is NOT necessary to register your controllers // e.g. container.RegisterType<ITestService, TestService>(); container.RegisterType<IEmployeeBusiness, EmployeeBusiness>(); DependencyResolver.SetResolver(new UnityDependencyResolver(container)); } } }
Step 4 :(IGNORE this step if you already have below interface and Class created in your project).
In previous tutorial(How to add Business Layer) if you do remember, we added interface and concrete class into our Business Layer. Do you? If not then create Business Layer and do below things..
"Add an Interface Folder into your business layer then create IEmployeBusiness interface and finally add a method into this example: GetEmployeeName(). After adding interface, add a concrete class EmpolyeeBusiness which will implement the IEmployeeBusiness Methods. Please see below screenshot. Copy below code in your interface and class."
A. IEmployeeBusiness( Interface)
using MVCTutorial.Domain; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MVCTutorial.Business.Interface { public interface IEmployeeBusiness { string GetEmployeeName(int EmpId); List<EmployeeDomainModel> GetAllEmployee(); } }
B. Employeebusiness ( Concrete class)
using MVCTutorial.Business.Interface; using MVCTutorial.Domain; using MVCTutorial.Repository; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MVCTutorial.Business { public class EmployeeBusiness : IEmployeeBusiness { public string GetEmployeeName(int EmpId) { return "Ashish" + EmpId; } public List<EmployeeDomainModel> GetAllEmployee() { List<EmployeeDomainModel> list = new List<EmployeeDomainModel>(); list.Add(new EmployeeDomainModel { Name = "Ashish", EmployeeId = 1 }); list.Add(new EmployeeDomainModel { Name = "Rob", EmployeeId = 2 }); list.Add(new EmployeeDomainModel { Name = "Sara", EmployeeId = 3 }); list.Add(new EmployeeDomainModel { Name = "Jack", EmployeeId = 4 }); list.Add(new EmployeeDomainModel { Name = "Peter", EmployeeId = 5 }); return list; } } }
Step 5 : Open your RepoController.cs file and paste below code. Here you can see, I have passed an interface object(IEmployeeBusiness empBusiness) as a parameter into the constructor of the controller. But wait, instead of interface I was expecting to pass the instance of EmployeeBusiness. If I directly pass it into the constructor then it will not follow the OOP Principle - "depend on the abstraction not on the concrete classes". So in this situation, Unity5 plugin help me to resolve this problem automatically.
#Controller Code(RepoController.cs) : using MVCTutorial.Business; using MVCTutorial.Business.Interface; using MVCTutorial.Domain; using MVCTutorial.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCTutorial.Controllers { public class RepoController : Controller { IEmployeeBusiness _empBusiness; // oop principle: depend on the abstraction not on the concrete classes public RepoController(IEmployeeBusiness empBusiness) { _empBusiness = empBusiness; } // GET: Repo public ActionResult Index() { ViewBag.EmpName = _empBusiness.GetEmployeeName(254); List<EmployeeDomainModel> listDomain = _empBusiness.GetAllEmployee(); List<EmployeeViewModel> listemployeeVM = new List<EmployeeViewModel>(); AutoMapper.Mapper.Map(listDomain, listemployeeVM); ViewBag.EmployeeList = listemployeeVM; return View(); } } }
using MVCTutorial.Infrastructure; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Threading; using System.Web; using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; namespace MVCTutorial { public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); UnityConfig.RegisterComponents(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); AutomapperWebProfile.Run(); //System.Web.Optimization.BundleTable.EnableOptimizations = true; } } }
Hope you enjoyed this lesion!
Please Like, Share and subscribe our Channel. Have a great day.
All Code Factory
- Part 11- Insert data into database
- Part 12- Server side and clientside validation
- Part 13- Insert data into multiple tables
- Part 14- Insert data into database using JQuery
- Part 15- How to create Bootstrap Popup
- Part 16- Delete operation in Asp.net MVC
- Part 17- What is Partial View in Asp.net MVC
- Part 18- How to call Partial View using JQuery
- Part 19- Difference between Html.Partial() and Html.RenderPartial()
- Part 20- AddEdit Record using Partial View
- Part 21- Layout View in Asp.net MVC
- Part 22- Style.Render and Script.Render
- Part 23 - RenderBody, RenderSection and RenderPage.
- Part 24- Divide Page into several component using Bootstrap
- Part 25- Refresh Entity framework after any modification in database table
- Part 26- Set foreign key relationnship in database tables
- Part 27- Create Rgistration Page
- Part 28- Create Login Page
- Part 29- Client Side Validation using JQuery
- Part 30- How to return multiple Model to a View (Interview)
- Part 31- How to create Dynamic Menu using Partial View
- Part 32- Preview Image Before Uploading
- Part 33- Upload and Display Image using JQuery
- Part 34-Upload Image to SQL Server and Display
- Part 35- Download Image from URL and Upload to SQL Server
- Part 36- Cascading DropdownList
- Part 37- Implement Search Functionality
- Part 38- Attribute Routing in MVC
- Part 39- How to display multiple checkbox checked data
- Part 40- How to send multiple checkbox checked value to Server
- Part 41- How to create responsive sortable Image Gallery
- Part 42 - How to implement JQuery Autocomplete Textbox
- Part 43 - How to send Emails in Asp.net MVC
- Part 44 - Integrate JQuery DataTables plugin
- Part 45 - Display record from database using JQuery Datatable
- Part 46- Add Edit Record using JQuery DataTable
- Part 47 - JQuery DataTables Server -side Processing
- Part 48 - JQuery server side processing -Search functionality
- Part 49 - Pagination using Skip and Take method
- Part 50 - Refresh DataTable After Performing Any Action
- Part 51 - Send OTP ( One Time Password ) to any mobile device
- Part 52 - How to use AutoMapper in Asp.net MVC
- Part 53 - How to use AutoMapper ForMember Method
- Part 54 - Repository Pattern - 1 - Adding Business Layer
- Part 55 - Repository Pattern - 2 - Adding Domain Layer
- Part 56 - Repository Pattern - 3 - Dependency Injection
- Part 57- Repository Pattern- 4 - Adding Data Access Layer
- Part 58 - Repository Pattern - 5 - Setting Up Generic Repository
- Part 59 - Display Record using repository pattern
- Part 60 - Add Edit Record using Repository Pattern
No comments:
Post a Comment