扩展UserManager导致ObjectDisposedException

时间:2018-11-13 18:14:44

标签: aspnetboilerplate

如果我扩展生成的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();
}

1 个答案:

答案 0 :(得分:1)

添加[UnitOfWork]属性并将其设置为virtual方法:

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

请参阅:UnitOfWork Attribute Restrictions

  

您可以将UnitOfWork属性用于:

     
      
  • 用于在接口上使用的类的所有 public public虚拟方法(就像在服务接口上使用的应用程序服务一样)。
  •   
  • 用于自注入类的所有公共虚拟方法(例如 MVC控制器 Web API控制器)。
  •   
  • 所有受保护的虚拟方法。
  •