Я объявлял событие на HTTP-модуле, поэтому он будет опросить подписчиков за истинное/ложное значение, чтобы определить, следует ли ему выполнить свою задачу по настройке HTTP-ответа. Если только один абонент отвечает на true, тогда он выполняет свою логику.Хорошо реализовать .NET-событие на IHttpModule?
Имеет ли это смысл?
Есть ли потенциальные ловушки, которых я не вижу?
public class ResponseTweaker : IHttpModule {
// to be a list of subscribers
List<Func<HttpApplication, bool>> listRespondants = new List<Func<HttpApplication, bool>>();
// event that stores its subscribers in a collection
public event Func<HttpApplication, bool> RequestConfirmation {
add {
listRespondants.Add(value);
}
remove {
listRespondants.Remove(value);
}
}
public void Init(HttpApplication context) {
if (OnGetAnswer(context)) // poll subscribers ...
// Conditionally Run Module logic to tweak Response ...
}
/* Method that polls subscribers and returns 'true'
* if only one of them answers yes.
*/
bool OnGetAnswer(HttpApplication app) {
foreach (var respondant in listRespondants)
if (respondant(app))
return true;
return false;
}
// etc...
}
Не совсем ловушкой, но вы, вероятно, получите немного более высокую производительность, если вы используете [HashSet] (http://msdn.microsoft.com/en-us/library/bb359438.aspx) (с порядка не имеет значения). И вам не нужно внешнее, если в 'OnGetAnswer', так как безопасно перебирать пустой список или набор. –
@Matthew F: Спасибо. Я удалил избыточное 'if'. Вы можете быть правы в HashSet, но я не ожидаю, что у вас будет много подписчиков, а тем более для них, чтобы удалить себя, поэтому я оставлю это как список на данный момент. –
Как потребители подписываются на события? Как они получают дескриптор IHttpModule и в каком случае они это делают? (я беспокоюсь, если они действительно будут повторно подписываться при перезагрузке пула приложений) –