ObjectDisposedException в службах управления ASP.NET Boilerplate

Я решил отделить логику от RoleAppService до RoleService, потому что мне нужно использовать методы ролей в других службах приложений. Разделяя логику, я могу избежать внедрения конечных точек в другие конечные точки (например, RoleAppService в UserAppService) и возможной циклической зависимости. API также не виден снаружи - поэтому класс наследуется от AbpServiceBase, а не от ApplicationService (что делает сервис видимым в swagger). К сожалению, когда я пытаюсь использовать шаблонные классы диспетчера (например, RoleManager, UserManager) внутри метода RoleService, возникает следующее исключение:

Cannot access a disposed object.
Object name: 'RoleManagerProxy'.

С трассировкой стека:

   at Microsoft.AspNetCore.Identity.RoleManager`1.ThrowIfDisposed()
   at Microsoft.AspNetCore.Identity.RoleManager`1.FindByNameAsync(String roleName)
   at Castle.Proxies.Invocations.RoleManager`1_FindByNameAsync.InvokeMethodOnTarget()
   at Castle.DynamicProxy.AbstractInvocation.Proceed()
   at Castle.DynamicProxy.AbstractInvocation.Proceed()
   at Castle.Proxies.RoleManagerProxy.FindByNameAsync(String roleName)
   at Abp.Authorization.Roles.AbpRoleManager`2.<CheckDuplicateRoleNameAsync>d__48.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Abp.Authorization.Roles.AbpRoleManager`2.<UpdateAsync>d__42.MoveNext() in D:\Github\aspnetboilerplate\src\Abp.ZeroCore\Authorization\Roles\AbpRoleManager.cs:line 283
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at VZero.Roles.RoleService.<Create>d__6.MoveNext() in C:\Users\Marcin\source\repos\translink.vendorforum\Translink.Api\src\VZero.Application\Roles\RoleService.cs:line 42
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at VZero.Roles.RoleService.<CreateOtherDocumentUserRole>d__9.MoveNext() in C:\Users\Marcin\source\repos\translink.vendorforum\Translink.Api\src\VZero.Application\Roles\RoleService.cs:line 94
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at VZero.Roles.RoleService.<GetOtherDocumentRole>d__11.MoveNext() in C:\Users\Marcin\source\repos\translink.vendorforum\Translink.Api\src\VZero.Application\Roles\RoleService.cs:line 107
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at VZero.Roles.RoleService.<UpdateOtherDocumentUserRole>d__10.MoveNext() in C:\Users\Marcin\source\repos\translink.vendorforum\Translink.Api\src\VZero.Application\Roles\RoleService.cs:line 100
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at VZero.Users.UserAppService.<Update>d__20.MoveNext() in C:\Users\Marcin\source\repos\translink.vendorforum\Translink.Api\src\VZero.Application\Users\UserAppService.cs:line 226
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Abp.Threading.InternalAsyncHelper.<AwaitTaskWithPostActionAndFinallyAndGetResult>d__5`1.MoveNext() in D:\Github\aspnetboilerplate\src\Abp\Threading\InternalAsyncHelper.cs:line 120
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at lambda_method(Closure , Object )
   at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.AwaitableObjectResultExecutor.<Execute>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__12.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeNextActionFilterAsync>d__10.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeInnerFilterAsync>d__13.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.<InvokeNextExceptionFilterAsync>d__24.MoveNext()

Ошибка, похоже, связана с конфигурацией фреймворка. Я попытался завершить имя службы с помощью AppService, но это совсем не помогло. Сервис зарегистрирован в рамках Виндзорского замка. Что интересно - внутри класса правильно работают стандартные репозитории, такие как RoleRepository, UserRepository - к сожалению, RoleManager/UserManager нет. Ниже приведен фрагмент класса:

public class RoleService : AbpServiceBase, IRoleService
    {
        private readonly RoleManager _roleManager;
        private readonly IRepository<Role> _roleRepository;
        private readonly UserManager _userManager;
        private readonly IRepository<User, long> _userRepository;
        private readonly IPermissionManager _permissionManager;

        public RoleService(RoleManager roleManager, IRepository<Role> roleRepository,
            UserManager userManager, IRepository<User, long> userRepository,
            IPermissionManager permissionManager)
        {
            _roleManager = roleManager;
            _roleRepository = roleRepository;
            _userManager = userManager;
            _userRepository = userRepository;
            _permissionManager = permissionManager;
        }

        public async Task<RoleDto> Create(CreateRoleDto createRoleDto, Action<IdentityResult> checkErrorsMethod)
        {
            var role = ObjectMapper.Map<Role>(createRoleDto);
            role.SetNormalizedName();
            await _roleManager.UpdateAsync(role); // here exception is thrown

            var grantedPermissions = _permissionManager
                .GetAllPermissions()
                .Where(p => createRoleDto.Permissions.Contains(p.Name))
                .ToList();

            await _roleManager.SetGrantedPermissionsAsync(role, grantedPermissions);
            return role.MapTo<RoleDto>();
        }

Я был бы так благодарен за любую помощь.


person Plusce    schedule 23.10.2018    source источник
comment
Добавьте атрибут [UnitOfWork].   -  person aaron    schedule 24.10.2018
comment
В моем случае это не помогает, создание новой транзакции тоже.   -  person Plusce    schedule 24.10.2018
comment
Мне кажется, что фреймворк заставляет использовать службы менеджера только в конечных точках.   -  person Plusce    schedule 24.10.2018
comment
Создайте репродукционный проект на GitHub.   -  person aaron    schedule 24.10.2018
comment
К сожалению, это невозможно - я работаю над коммерческим кодом. Я могу добавить некоторые фрагменты кода, если это необходимо.   -  person Plusce    schedule 25.10.2018
comment
Создайте новый проект. Вам необходимо предоставить достаточный код, чтобы воспроизвести вашу проблему.   -  person aaron    schedule 26.10.2018


Ответы (1)


Если вы добавляете атрибут [UnitOfWork], не забудьте сделать метод public virtual

person bobj    schedule 07.02.2019