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

前端 未结 9 1749
挽巷
挽巷 2020-12-23 03:08

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,

9条回答
  •  醉话见心
    2020-12-23 03:58

    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), p => new UserStore(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, ApplicationRoleManager>();
    
        // Maps the role store role to the implemented type
        services.AddTransient, RoleStore>();
        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 _roleManager;
    
        public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager, RoleManager roleManager)
        {
            UserManager = userManager;
            SignInManager = signInManager;
            RoleManager = roleManager;
        }
    }
    

提交回复
热议问题