Недавно я наткнулся на следующее в нашем приложении, и мне любопытно узнать, хорошая ли это или плохая практика. То, что я вижу, - это события, которые подписываются на разных уровнях приложения, бизнес-логики и, в конечном счете, наших рамок.Рекомендации по подписке на события
У нас есть функциональность для аутентификации и авторизации пользователей, которое организовано с помощью HttpModule, который в основном делает следующее (я только включены наиболее значимые части):
public class FooModule : IHttpModule
{
private IIdentityProvider _identityProvider;
public void Init(HttpApplication context)
{
_identityProvider = TypeFactory.Create<IIdentityProvider>("...type string from configuration...");
identityProvider.Init(context, ...);
context.PostAuthenticateRequest += OnAuthenticateRequest;
context.PostAuthenticateRequest += OnAuthenticateRequestLogging;
}
...
}
До сих пор так хорошо: HttpModule Идентифицирует настроенный поставщик удостоверений, инициализирует его и подписывается на некоторые события. Обработчики событий здесь не подвержены сомнению, поэтому я их опустил.
Затем в инициализации произвольного поставщика идентичности:
public class BarIdentityProvider : IIdentityProvider
{
public void Init(HttpApplication httpApplication, ...)
{
var authorizer = new BarAuthorizationProvider();
authorizer.Init(httpApplication, ...);
httpApplication.PostAuthenticateRequest += httpApplication_PostAuthenticateRequest;
httpApplication.AuthorizeRequest += httpApplication_AuthorizeRequest;
}
...
}
И в AuthorizationRequestHandler происходит следующее:
public class BarAuthorizationProvider
{
public void Init(HttpApplication httpApplication, ...)
{
httpApplication.PostAuthorizeRequest += OnAuthorizeRequest;
}
...
}
Как вы можете видеть, есть события, которые подписывались в FooModule , BarIdentityProvider и BarAuthorizationProvider, который для меня встречается как спагетти событий. Кроме того, при этом:
var authorizer = new BarAuthorizationProvider();
authorizer.Init(httpApplication, ...);
Я не ожидал, что authorizer
подписаться на различные события и работы «волшебно».
Как разработчик программного обеспечения я ожидаю либо:
- один HttpModule, который подписывается на необходимые мероприятия и запрашивает провайдера идентификации и авторизации поставщика для идентификационной информации и доступа. Управление событиями минимизируется у поставщиков.
- несколько HttpModules (то есть аутентификация и модуль авторизации), каждый из которых подписывается на необходимые события. Управление событиями минимизируется у поставщиков.
Я верю или нет аргументов против моего ожидания?