Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create dependency injection for ASP.NET MVC 5?

Creating Dependency Injection with ASP.NET Core is fairly easy. The documentation explains it very well here and this guy has a killer video to explain it.

However, I want to do the same thing with my ASP.NET MVC 5 project. How can handle dependency injection with ASP.MVC 5?

Also, is Dependency injection limited to controllers only or can it work with any class?

like image 923
Jaylen Avatar asked Apr 09 '17 19:04

Jaylen


People also ask

What is dependency injection in MVC 5?

The Dependency Injection commonly called DI pattern helps to inject the concrete implementation of dependent object and finally achieve a low degree of coupling. So, this frees the class from instantiating dependent object and in other words, it does not have any knowledge of the dependent service implementation.

Can we use dependency injection in asp net?

ASP.NET Core supports the dependency injection (DI) software design pattern, which is a technique for achieving Inversion of Control (IoC) between classes and their dependencies. For more information specific to dependency injection within MVC controllers, see Dependency injection into controllers in ASP.NET Core.

What is IoC in ASP.NET MVC?

LINQ ASP.NET MVC Entity Framework. As you delve more into ASP.NET MVC you start to come across a whole new way of doing things that Web Forms development didn't really expose you to. Inversion of Control (IoC) and Dependency Injection (DI) are two phrases that crop up a lot in the MVC space.


1 Answers

In ASP.Net MVC you can use the .Net Core DI from NuGet rather than one of the third-party alternatives:-

using Microsoft.Extensions.DependencyInjection 

For the MVC Start/Configuration class:-

public void Configuration(IAppBuilder app) {     // We will use Dependency Injection for all controllers and other classes, so we'll need a service collection     var services = new ServiceCollection();      // configure all of the services required for DI     ConfigureServices(services);      // Configure authentication     ConfigureAuth(app);      // Create a new resolver from our own default implementation     var resolver = new DefaultDependencyResolver(services.BuildServiceProvider());      // Set the application resolver to our default resolver. This comes from "System.Web.Mvc"     //Other services may be added elsewhere through time     DependencyResolver.SetResolver(resolver); } 

My project uses Identity User and I've replaced the OWIN start-up configuration to follow a service-based approach instead. The default Identity User classes use static factory methods to create instances. I've moved that code into the constructors and relied on DI to provide the appropriate injection. It is still work in progress but here is where I am at:-

public void ConfigureServices(IServiceCollection services) {                    //====================================================     // Create the DB context for the IDENTITY database     //====================================================     // Add a database context - this can be instantiated with no parameters     services.AddTransient(typeof(ApplicationDbContext));      //====================================================     // ApplicationUserManager     //====================================================     // instantiation requires the following instance of the Identity database     services.AddTransient(typeof(IUserStore<ApplicationUser>), p => new UserStore<ApplicationUser>(new ApplicationDbContext()));      // with the above defined, we can add the user manager class as a type     services.AddTransient(typeof(ApplicationUserManager));      //====================================================     // ApplicationSignInManager     //====================================================     // instantiation requires two parameters, [ApplicationUserManager] (defined above) and [IAuthenticationManager]     services.AddTransient(typeof(Microsoft.Owin.Security.IAuthenticationManager), p => new OwinContext().Authentication);     services.AddTransient(typeof(ApplicationSignInManager));      //====================================================     // ApplicationRoleManager     //====================================================     // Maps the rolemanager of identity role to the concrete role manager type     services.AddTransient<RoleManager<IdentityRole>, ApplicationRoleManager>();      // Maps the role store role to the implemented type     services.AddTransient<IRoleStore<IdentityRole, string>, RoleStore<IdentityRole>>();     services.AddTransient(typeof(ApplicationRoleManager));          //====================================================     // Add all controllers as services     //====================================================     services.AddControllersAsServices(typeof(Startup).Assembly.GetExportedTypes()         .Where(t => !t.IsAbstract && !t.IsGenericTypeDefinition)     .Where(t => typeof(IController).IsAssignableFrom(t)     || t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase))); } 

The Account Controller class has the single constructor:-

[Authorize] public class AccountController : Controller {     private ApplicationSignInManager _signInManager;     private ApplicationUserManager _userManager;     private RoleManager<IdentityRole> _roleManager;      public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager, RoleManager<IdentityRole> roleManager)     {         UserManager = userManager;         SignInManager = signInManager;         RoleManager = roleManager;     } } 

My Default Dependency Resolver:

/// <summary> /// Provides the default dependency resolver for the application - based on IDependencyResolver, which hhas just two methods /// </summary> public class DefaultDependencyResolver : IDependencyResolver {     /// <summary>     /// Provides the service that holds the services     /// </summary>     protected IServiceProvider serviceProvider;      /// <summary>     /// Create the service resolver using the service provided (Direct Injection pattern)     /// </summary>     /// <param name="serviceProvider"></param>     public DefaultDependencyResolver(IServiceProvider serviceProvider)     {         this.serviceProvider = serviceProvider;     }      /// <summary>     /// Get a service by type - assume you get the first one encountered     /// </summary>     /// <param name="serviceType"></param>     /// <returns></returns>     public object GetService(Type serviceType)     {         return this.serviceProvider.GetService(serviceType);     }      /// <summary>     /// Get all services of a type     /// </summary>     /// <param name="serviceType"></param>     /// <returns></returns>     public IEnumerable<object> GetServices(Type serviceType)     {         return this.serviceProvider.GetServices(serviceType);     } } 
like image 166
pixelda Avatar answered Sep 19 '22 19:09

pixelda