【发布时间】:2023-04-08 22:10:02
【问题描述】:
我最近在我们的应用程序中偶然发现了以下内容,我很想知道这是好的还是坏的做法。我看到的是在应用程序、业务逻辑和最终我们的框架的不同级别上订阅的事件。
我们有对用户进行身份验证和授权的功能,它由一个 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(即一个身份验证和一个授权模块),每个都订阅必要的事件。事件处理在提供程序中被最小化。
我是正确的还是有反对我期望的论据?
【问题讨论】:
标签: c# events frameworks