在默认MVC中使用单位的依赖注入会中断登录

时间:2016-10-31 12:00:23

标签: c# asp.net-mvc dependency-injection unity-container

我正在编写一个Web应用程序,并且我使用默认的Microsoft MVC站点作为起点。在此之后,我创建了一个使用实体框架在我的Web应用程序中使用的配方数据库,并编写了一个存储库和一些业务层方法。然后我使用Unity的依赖注入来消除它们之间的耦合。我在global.asax.cs中使用了放在MvcApplication类中的代码。

private IUnityContainer Container;
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            ConfigureObjects();


        }

        private void ConfigureObjects()
        {
            Container = new UnityContainer();
            Container.RegisterType<IRecipeRequest, BasicRecipeRequest>();
            Container.RegisterType<IRecipeRepository, RecipeRepositoryEntityFramework>();
            Container.RegisterType<IRecipeContext, RecipeContext>();

            DependencyResolver.SetResolver(new UnityDependencyResolver(Container));
        } 

我的位只是与依赖注入有关的位。

使用与用户登录相关的任何页面执行此操作后将返回并出现错误,例如注册,登录。它将返回标题为:

的错误
The current type, Microsoft.AspNet.Identity.IUserStore`1[UKHO.Recipes.Www.Models.ApplicationUser], is an interface and cannot be constructed. Are you missing a type mapping? 

查看使用诊断工具在visual studio中抛出的异常,我得到了这个:

"An error occurred when trying to create a controller of type 'UKHO.WeeklyRecipes.Www.Controllers.AccountController'. Make sure that the controller has a parameterless public constructor."

AccountsContoler是由deafult创建的控制器,我没有触及它,它包含一个无参数构造函数和另一个构造函数。它们看起来像这样:

   public AccountController()
            {
            }


   public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager )
            {
                UserManager = userManager;
                SignInManager = signInManager;
            }

通过将[InjectionConstructor()]放在无参数构造函数前面,错误就消失了。在我看来,Unity正在尝试解析ApplicationUserManager和ApplicationSignInManager,即使我没有注册这些类型,并且使[InjectionConstructor()]统一看到空构造函数,所以什么都不做。我主要想知道为什么会发生这种情况,因为我认为团结只会干扰你注册的类型。黄油解决方案也很受欢迎。

编辑:当您希望更改帐户设置但使用ManageContoler发生错误时也会发生这种情况,这也可以通过将[InjectionConstructor()]放在空构造函数前面来解决。

1 个答案:

答案 0 :(得分:0)

您仅配置了以下对象的依赖项:

Container.RegisterType<IRecipeRequest, BasicRecipeRequest>();
            Container.RegisterType<IRecipeRepository, RecipeRepositoryEntityFramework>();
            Container.RegisterType<IRecipeContext, RecipeContext>();

但是在您的控制器上,您有2个未配置的依赖项,ApplicationUserManager和ApplicationSignInManager。

Unity不了解这些依赖关系,因此无法在构造函数上注入,因此尝试调用无参数构造函数。

如果您的控制器上有一个带有参数的构造函数,unity将查找它并尝试解析所有依赖项,无论您配置哪些依赖项。如果它确实找到了一个对象,它就会中断。