Ошибка: «Значение не может быть нулевым. Имя параметра: context 'ASP. NET MVC - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь получить доступ к _context из внедрения зависимостей, однако получаю сообщение об ошибке:

'Значение не может быть нулевым. Имя параметра: context '

В AdminController.cs у меня есть следующее:

using Microsoft.AspNet.Identity;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Web;
using System.Web.Mvc;
using Microsoft.AspNet.Identity.EntityFramework;
using System.Threading.Tasks;

namespace GuildCars.UI.Controllers
{
    public class AdminController : Controller
    {
        private readonly ApplicationDbContext _context;
        public AdminController(ApplicationDbContext context)
        {
            _context = context;
        }
        public AdminController() { }    
...

public ActionResult EditUser(string id)
        {
            var userMgr = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(_context)); //fail to get _context.
            var appUser = userMgr.FindById(id);
            //var appUser = userMgr.FindByEmail(email);

            var user = new UserEditViewModel
            {
                UserID = appUser.Id,
                FirstName = appUser.FirstName,
                LastName = appUser.LastName,
                Email = appUser.Email,
                Role = appUser.Role
            };


            return View(user);
        }  

Внедрение зависимости, как у меня выше, не работает, однако, если я использую следующий код он работает с оператором using:

using (var ctx = new ApplicationDbContext())
                    {
                        ctx.Cars.Add(model.Car);

                        if (model.Car == null)
                            model.Car = new Car();

                        ctx.SaveChanges();
                    }

Я проверил свой Startup.Auth.cs, и у меня есть ApplicationDbContext.Create:

public void ConfigureAuth(IAppBuilder app)
        {
            // Configure the db context, user manager and signin manager to use a single instance per request
            app.CreatePerOwinContext(ApplicationDbContext.Create);
            app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
            app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
...

Кроме того, я проверил, есть ли у меня метод Create() в IdentityModels.cs, и он у меня есть.

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection", throwIfV1Schema: false)
        {
        }

        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }

        public DbSet<Car> Cars { get; set; }
        public DbSet<Transaction> Transactions { get; set; }
        public DbSet<BodyStyle> BodyStyles { get; set; }
        public DbSet<ContactUs> ContactUs { get; set; }
        public DbSet<ExteriorColor> ExteriorColors { get; set; }
        public DbSet<InteriorColor> InteriorColors { get; set; }
        public DbSet<Make> Makes { get; set; }
        public DbSet<Model> Models { get; set; }
        public DbSet<Specials> Specials { get; set; }
        public DbSet<Transmission> Transmissions { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

        }


    }

Я новичок в использовании внедрения зависимостей в ASP. NET MVC, в чем может быть моя проблема?

1 Ответ

0 голосов
/ 13 июля 2020

Microsoft представила IServiceCollection в ASP. NET Core 1 (также известном как ASP. NET MVC 6). Это собственная библиотека внедрения зависимостей, поставляемая с фреймворком.

До MVC 6, в MVC 5 мы могли использовать внешние библиотеки внедрения зависимостей, такие как unity, autofac или ninject.

Inline - это пример того, как использовать контейнер unity io c в ASP. NET MVC 5

  • Install 'Unity' Пакет Nuget в ваш проект.

  • Добавьте свои пользовательские типы в контейнер.

  • Обеспечьте реализацию для IDependencyResolver с объектом контейнера Unity и назначьте его DependencyResolver объекта HttpConfiguration.

     public void ConfigureAuth(IAppBuilder app)
     {
         var config = new HttpConfiguration();
    
         var unityContainer = new UnityContainer();
         unityContainer.RegisterType<ApplicationDbContext>();
         config.DependencyResolver = new UnityResolver(unityContainer);
    
         //More code
    
         app.UseWebApi(config);
     }
    
     public class UnityResolver : IDependencyResolver
     {
         protected IUnityContainer container;
    
         public UnityResolver(IUnityContainer container)
         {
             if (container == null)
             {
                 throw new ArgumentNullException("container");
             }
             this.container = container;
         }
    
         public object GetService(Type serviceType)
         {
             try
             {
                 return container.Resolve(serviceType);
             }
             catch (ResolutionFailedException)
             {
                 return null;
             }
         }
    
         public IEnumerable<object> GetServices(Type serviceType)
         {
             try
             {
                 return container.ResolveAll(serviceType);
             }
             catch (ResolutionFailedException)
             {
                 return new List<object>();
             }
         }
    
         public IDependencyScope BeginScope()
         {
             var child = container.CreateChildContainer();
             return new UnityResolver(child);
         }
    
         public void Dispose()
         {
             Dispose(true);
         }
    
         protected virtual void Dispose(bool disposing)
         {
             container.Dispose();
         }
     }
    

Установив контейнер Unity, вы можете избавиться от app.CreatePerOwinContext и метода create.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...