Как уже отвечали другие, такие сквозные проблемы часто решаются с помощью Аспектно-ориентированного программирования (AOP).
Один из способов сделать AOP - это инструментарий кода с помощью таких инструментов, как PostSharp, но альтернатива, которая не требует дополнительных инструментов, - это использование Внедрение зависимостей (DI) и Decorator design шаблон.
Представьте, что ваш код использует интерфейс IFoo:
public interface IFoo
{
string GetStuff(string request);
}
У вас может быть конкретная реализация MyFoo
IFoo, но вы также можете написать один или несколько декораторов, которые обрабатывают различные аспекты:
public class AdministratorGuardingFoo : IFoo
{
private readonly IFoo foo;
public AdministratorGuardingFoo(IFoo foo)
{
if (foo == null)
{
throw new ArgumentNullException("foo");
}
this.foo = foo;
}
public string GetStuff(string request)
{
new PrincipalPermission(null, "Administrator").Demand();
return this.foo.GetStuff(request);
}
}
Теперь вы можете (иметь свой DI-контейнер) завернуть MyFoo
в AdministratorGuardingFoo
. Все потребители, которые потребляют IFoo
, не заметят разницы.