我正在编写一个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()]
放在空构造函数前面来解决。
答案 0 :(得分:0)
您仅配置了以下对象的依赖项:
Container.RegisterType<IRecipeRequest, BasicRecipeRequest>();
Container.RegisterType<IRecipeRepository, RecipeRepositoryEntityFramework>();
Container.RegisterType<IRecipeContext, RecipeContext>();
但是在您的控制器上,您有2个未配置的依赖项,ApplicationUserManager和ApplicationSignInManager。
Unity不了解这些依赖关系,因此无法在构造函数上注入,因此尝试调用无参数构造函数。
如果您的控制器上有一个带有参数的构造函数,unity将查找它并尝试解析所有依赖项,无论您配置哪些依赖项。如果它确实找到了一个对象,它就会中断。