Я думаю, что особенности моего вопроса сильно отличаются от других подобных вопросов, которые у меня есть.Custom AuthorizeAttribute Ninject Property Injection не работает (вложенное свойство имеет вспомогательные сервисы, которые необходимо ввести)
Я знаю, что когда у меня есть пользовательский атрибут AuthorizeAttribute, я не могу вставлять зависимости с конструктором. Это связано с тем, что конструктор примет параметры - в моем случае - строки прав доступа.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class UserAllCSPermissionBasedAuthFilter : AuthorizeAttribute
{
Я в зависимости от службы авторизации, поэтому меня вводят с использованием инъекции свойств.
[Inject]
public IAuthorizationService _authorizationService { get; set; }
Проблема в том, что эта услуга зависит от другой службы - обслуживания пользователей, которая напрямую связана с репозиторием и dbcontext. У меня есть указание, чтобы мой контекст db находился в области запроса. Это исключение - «Операция не может быть завершена, потому что DbContext был удален». Когда я посмотрел на код, это происходит, когда служба авторизации вызывает службу пользователей, которая запрашивает dbcontext для некоторых данных. Как избежать этого?
public class AuthorizationService : IAuthorizationService
{
private readonly ICommonRepository _commonRepository;
private readonly IRepositoryBase<UsersInRolesEntity> _repositoryUsersInRoles;
private readonly IRepositoryBase<UserCustomerRolesEntity> _repositoryCurstomerRoleEntities;
private readonly ISqlCustomersRepository _sqlCustomerRepository;
private readonly IRoleService _roleService;
private readonly IUserService _userService;
private readonly IPermissionService _permissionService;
public AuthorizationService(
IRepositoryBase<UsersInRolesEntity> repositoryUsersInRoles,
IRepositoryBase<UserCustomerRolesEntity> repositoryCurstomerRoleEntities,
ICommonRepository commonRepository,
ISqlCustomersRepository sqlCustomerRepository,
IRoleService roleService,
IUserService userService,
IPermissionService permissionService
)
{
Должен ли я использовать условные привязки Ninject в моем случае? Или я сделал что-то неправильно? –
Предотвратите впрыскивание зависимостей в ваши атрибуты, как описано [здесь] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=98) и [здесь] (http: //blog.ploeh .dk/2014/06/13/пассивные-атрибуты /). – Steven
Спасибо за ссылки, я думаю, они полезны, но мне сложно переварить их. Автор говорит: «Проблема с этим подходом заключается в том, что экземпляры атрибутов создаются во время выполнения, поэтому вы не можете использовать правильные шаблоны зависимостей зависимостей (DI), такие как инжекция конструктора. Если атрибут определяет поведение (что многие из Атрибуты веб-API), наиболее распространенной попыткой написания слабосвязанного кода является обращение к статическому локатору сервисов (анти-шаблон). " то его решение «определяет атрибуты без поведения».В его решении я не вижу, как при выполнении фильтра –