这是一个代码设计问题:)
我有一个 DelegatingHandler 接受 http 请求标头并验证 API 密钥。我猜这是很常见的任务。在我的控制器中,我调用我的业务逻辑并传递所有与业务相关的信息。但是,现在我面临的挑战是根据某些 api 键来改变我的业务逻辑(单独的程序集)中的行为。
我想到了各种可能的解决方案......
更改业务逻辑方法签名以请求 API 密钥。
public void SomeUseCase(Entity1 e1, Entity2 e2, string apiKey);
使用 HttpContext.Current 访问当前请求上下文。但是,我在某处读到使用 HttpContext 将我的托管选项限制为 IIS。有没有更适合的选择?
var request = HttpContext.Current.Request; // 接下来提取头信息
使用会话(真的不想走那条路......)
你对这个话题有什么看法?
我会选择#1,尽管我不喜欢在业务逻辑方法中混入环境的东西。但是根据您的观点,您可能会认为 api-key 实际上与逻辑相关。
更新 #1: 我使用 delegatingHandler 来验证 apiKey,一旦验证,我将其添加到请求的属性集合中。
有问题的部分是“api-key”或 RegisteredIdentifier 如何传递到业务逻辑层。现在我将对象(例如 IRegisteredIdentifier)作为参数传递给业务逻辑类的构造函数。我知道没有更优雅的方法来解决这个问题(?)。我考虑过更改方法签名,但不确定是否是接口污染。有些方法需要使用 api-key,大多数不需要。经验告诉我,这个数字更有可能增长而不是下降 :) 所以在我的 bl 类中保留对它的引用似乎是一个不错的选择。
感谢您的回答 - 我认为它们都是我解决方案的一部分。我是 StackOverflow 的新手.. 但据我所知 - 我还不能评价答案。请放心,我仍然很感激:)