c#-配置StructureMap.MVC5与身份一起使用的问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-配置StructureMap.MVC5与身份一起使用的问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2844字,纯文字阅读大概需要5分钟。
内容图文
从最初从未正确实现的旧版本(2.6)升级后,我目前正在尝试在我们的应用程序中重新配置StructureMap.
我是刚开始使用DI容器的新手,并且很难找到有关新的StructureMap版本的文档.我卸载了旧的2.6版本的StructureMap并安装了StructureMap.MVC5(因为我正在使用MVC5).
我遇到的问题是AccountController.我设置了StructureMap来使用无参数构造函数,但是当我的应用程序尝试创建UserManager时,我收到一个InvalidOperationException,“在上下文中找不到owin.Environment项.”
显然,我需要对StructureMap进行其他配置,但是我不知道该做什么/如何做.我可以找到一百万个错误源,所有这些都建议在web.config中添加一个标记,但是它们似乎都不是特定于DI容器的-我只有在使用StructureMap而不是让框架创建控制器时才遇到此问题.
下面是相关代码; AccountController的那一部分只是股票模板代码.
AccountController.cs
private ApplicationUserManager _userManager;
public AccountController()
{
}
public AccountController(ApplicationUserManager userManager)
{
UserManager = userManager;
}
public ApplicationUserManager UserManager
{
get
{
// This is where the exception is thrown
return _userManager ??
HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
DefaultRegistry.cs
public DefaultRegistry()
{
Scan(
scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.With(new ControllerConvention());
});
For<IBasicRepository>()
.Use<EntityRepository>()
.LifecycleIs<HttpContextLifecycle>()
.Ctor<string>("ConnectionString")
.Is(ConfigurationManager.ConnectionStrings["MyContext"].ConnectionString);
For<AccountController>()
.Use<AccountController>()
.SelectConstructor(() => new AccountController());
}
解决方法:
正如@Erik Funkenbusch指出的那样,我正在做比赛.我最终使UserManager成为自动属性,删除了无参数的构造函数,然后让StructureMap注入ApplicationUserManager.
public ApplicationUserManager UserManager { get; private set; }
public AccountController(ApplicationUserManager userManager)
{
UserManager = userManager;
}
然后,我只需要配置Identity在DefaultRegistry.cs中使用的IUserStore和DbContext:
For<IUserStore<ApplicationUser, int>>()
.Use<UserStore<ApplicationUser, CustomRole, int, CustomUserLogin,
CustomUserRole, CustomUserClaim>>()
.LifecycleIs<HttpContextLifecycle>();
For<DbContext>()
.Use(() => new ApplicationDbContext())
.LifecycleIs<HttpContextLifecycle>();
我要做的就是让StructureMap.MVC与Identity一起使用.
我最初的挂断的部分原因是我没有意识到StructureMap.MVC(和其他DI容器)的工作方式. (请参阅my related question.)我期望它只能与由框架初始化的股票AccountController一起使用(并认为它神奇地拦截了对象创建以注入我配置的任何东西),但没有意识到StructureMap必须初始化控制器本身才能为它执行构造函数注入.因此,当我遇到问题时,我是A.我很惊讶StructureMap首先与我的AccountController有关(因为我没有为它的任何参数明确配置注入-仅针对其他控制器中使用的存储库),和B.我不是在考虑更改我的股票代码,而是在考虑如何配置StructureMap.原来我需要同时做这两项.幸运的是,这是一个简单的修改,我了解了更多有关DI容器如何工作的知识.
内容总结
以上是互联网集市为您收集整理的c#-配置StructureMap.MVC5与身份一起使用的问题全部内容,希望文章能够帮你解决c#-配置StructureMap.MVC5与身份一起使用的问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。