首页 > 解决方案 > 扩展 UserManager 导致 ObjectDisposedException

问题描述

如果我扩展生成的 aspnetboilerplate UserManager 类(从启动模板),任何时候我使用 RoleManager 都会收到 ObjectDisposedException 异常。我认为这与依赖注入有关。有什么明显的我做错了(或不应该做的)吗?

这是 UserManager 类定义(我在底部添加的方法)

namespace MyProject.Authorization.Users
{
    public class UserManager : AbpUserManager<Role, User>
    {
        public UserManager(
            RoleManager roleManager,
            UserStore store, 
            IOptions<IdentityOptions> optionsAccessor, 
            IPasswordHasher<User> passwordHasher, 
            IEnumerable<IUserValidator<User>> userValidators, 
            IEnumerable<IPasswordValidator<User>> passwordValidators,
            ILookupNormalizer keyNormalizer, 
            IdentityErrorDescriber errors, 
            IServiceProvider services, 
            ILogger<UserManager<User>> logger, 
            IPermissionManager permissionManager, 
            IUnitOfWorkManager unitOfWorkManager, 
            ICacheManager cacheManager, 
            IRepository<OrganizationUnit, long> organizationUnitRepository, 
            IRepository<UserOrganizationUnit, long> userOrganizationUnitRepository, 
            IOrganizationUnitSettings organizationUnitSettings, 
            ISettingManager settingManager)
            : base(
                roleManager, 
                store, 
                optionsAccessor, 
                passwordHasher, 
                userValidators, 
                passwordValidators, 
                keyNormalizer, 
                errors, 
                services, 
                logger, 
                permissionManager, 
                unitOfWorkManager, 
                cacheManager,
                organizationUnitRepository, 
                userOrganizationUnitRepository, 
                organizationUnitSettings, 
                settingManager)
        {
        }

        public void GoBoom()
        {
            var role = RoleManager.Roles.FirstOrDefault();
        }
    }
}

用法(这里,直接注入并在剃刀视图上使用)

@inject MyProject.Authorization.Users.UserManager _userManager
@{
    _userManager.GoBoom();
}

标签: aspnetboilerplate

解决方案


添加[UnitOfWork]属性并使其成为virtual方法:

[UnitOfWork]
public virtual void GoBoom()
{
    ...
}

请参阅:UnitOfWork 属性限制

您可以将 UnitOfWork 属性用于:

  • 通过接口使用的类的所有公共公共虚拟方法(如通过服务接口使用的应用程序服务)。
  • 自注入类的所有公共虚拟方法(如MVC 控制器Web API 控制器)。
  • 所有受保护的虚方法。

推荐阅读