ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#-配置StructureMap.MVC5与身份一起使用的问题

2019-10-29 04:05:38  阅读:184  来源: 互联网

标签:asp-net-identity structuremap c asp-net-mvc


从最初从未正确实现的旧版本(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容器如何工作的知识.

标签:asp-net-identity,structuremap,c,asp-net-mvc
来源: https://codeday.me/bug/20191029/1957241.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有