Динамический прокси - перехватчик - позволяет перехватывать звонки на любой интерфейс. Допустим, вы хотите перехватить любую запись в любой реализации любого интерфейса. Сколько декораторов вам придется реализовать? И все они содержали бы один и тот же код, но получали бы другой интерфейс в конструкторе. И им придется реализовать все методы оформления интерфейса. Так много повторяющегося кода. Скучно и не СУХОЙ.
С помощью Castle вы можете один раз реализовать IInceptceptor и использовать его для выполнения описанного выше.
public class LoggingInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
// log method call and parameters
try
{
invocation.Proceed();
}
catch (Exception e)
{
// log exception
throw; // or sth else
}
}
}
Ответ на ваше ОБНОВЛЕНИЕ:
Это не было бы выгодно. И, вероятно, неправильно. Или, может быть, я не понимаю, что вы имеете в виду. Может быть, это?
public class ServiceSelectingWhatCallToMake : IHaveCookies
{
public ServiceSelectingWhatCallToMake(IHaveCookies localCalls, IHaveCookies networkCalls)
{
// save in member variables
}
public SomeMethod()
{
if (somethingDescribingIShouldMakeLocalCall)
this.localCalls.SomeMethod();
else
this.networkCalls.SomeMethod();
}
}
Тогда это действительно должно быть
public class ServiceThatDoesntKnowWhatCallItMakes
{
public ServiceSelectingWhatCallToMake(IHaveCookiesFactory factory)
{
// save in member variables
}
public SomeMethod()
{
var localOrNetwork = this.factory.Create(somethingDescribingWhatCallToMake)
localCalOrNetwork.SomeMethod();
}
}
Так что нет места для декоратора / перехватчика.
Как и другие описанные, я бы использовал перехватчики для сквозных задач - регистрация, аудит, кэширование, безопасность и т. Д.