gpt4 book ai didi

c# - 配置 StructureMap.MVC5 以使用身份的问题

转载 作者:行者123 更新时间:2023-11-30 15:28:10 24 4
gpt4 key购买 nike

从一开始就没有正确实现的旧版本 (2.6) 升级后,我目前正在尝试在我们的应用程序中重新配置 StructureMap。我是刚开始使用 DI 容器的新手,并且很难找到新版本 StructureMap 的文档。我卸载了旧的 2.6 版本的 StructureMap 并安装了 StructureMap.MVC5(因为我使用的是 MVC5)。

我遇到的问题是 AccountController。我将 StructureMap 设置为使用无参数构造函数,但是当我的应用程序尝试创建 UserManager 时,我得到一个 InvalidOperationException“No owin.Environment item was found in the context.”

显然我需要为 StructureMap 进行额外的配置,但我不知道是什么/如何。我可以找到这个错误的一百万个来源,所有这些都建议在 web.config 中添加一个标签,但它们似乎都不是特定于 DI 容器的 - 我只有在使用 StructureMap 与让框架创建 Controller 时才会遇到这个问题。

下面是相关代码; AccountController 的那部分只是库存模板代码。

账户 Controller .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;
}
}

默认注册表.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 注入(inject) 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 一起工作,它由框架初始化(并认为它神奇地拦截了对象创建以注入(inject)我配置的任何东西),没有意识到 StructureMap 必须初始化 Controller 本身命令它执行构造函数注入(inject)。所以当我遇到问题时,我是 A。首先我对 StructureMap 与我的 AccountController 有任何关系感到惊讶(因为我没有明确为其任何参数配置注入(inject) - 仅针对我在其他 Controller 中使用的存储库),和 B. 我没有考虑更改我的股票代码,而是考虑如何配置 StructureMap。事实证明我需要两者都做。幸运的是,这是一个简单的修改,我对 DI 容器的工作原理有了更多的了解。

关于c# - 配置 StructureMap.MVC5 以使用身份的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26240873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com