방금 Greg Young이 사람들에게 KISS에 경고하는 이야기 를 보았습니다 .
그가 제안한 것 중 하나는 Aspect 지향 프로그래밍을하기 위해서는 프레임 워크가 필요 하지 않다는 것 입니다.
그는 모든 제약 조건이 하나의 매개 변수 만 취해야한다는 강력한 제약 조건으로 시작합니다 ( 부분적 적용을 사용하여 조금 나중에 이완 하지만 ).
그가 제공하는 예는 인터페이스를 정의하는 것입니다.
public interface IConsumes<T>
{
void Consume(T message);
}
명령을 내리려면 :
public class Command
{
public string SomeInformation;
public int ID;
public override string ToString()
{
return ID + " : " + SomeInformation + Environment.NewLine;
}
}
명령은 다음과 같이 구현됩니다.
public class CommandService : IConsumes<Command>
{
private IConsumes<Command> _next;
public CommandService(IConsumes<Command> cmd = null)
{
_next = cmd;
}
public void Consume(Command message)
{
Console.WriteLine("Command complete!");
if (_next != null)
_next.Consume(message);
}
}
콘솔에 로깅하기 위해 다음을 구현합니다.
public class Logger<T> : IConsumes<T>
{
private readonly IConsumes<T> _next;
public Logger(IConsumes<T> next)
{
_next = next;
}
public void Consume(T message)
{
Log(message);
if (_next != null)
_next.Consume(message);
}
private void Log(T message)
{
Console.WriteLine(message);
}
}
그런 다음 사전 명령 로깅, 명령 서비스 및 사후 명령 로깅은 다음과 같습니다.
var log1 = new Logger<Command>(null);
var svr = new CommandService(log);
var startOfChain = new Logger<Command>(svr);
명령은 다음에 의해 실행됩니다.
var cmd = new Command();
startOfChain.Consume(cmd);
예를 들어 PostSharp 에서이를 수행하려면 다음과 같이 주석을 달아야합니다CommandService
.
public class CommandService : IConsumes<Command>
{
[Trace]
public void Consume(Command message)
{
Console.WriteLine("Command complete!");
}
}
[Serializable]
public class TraceAttribute : OnMethodBoundaryAspect
{
public override void OnEntry( MethodExecutionArgs args )
{
Console.WriteLine(args.Method.Name + " : Entered!" );
}
public override void OnSuccess( MethodExecutionArgs args )
{
Console.WriteLine(args.Method.Name + " : Exited!" );
}
public override void OnException( MethodExecutionArgs args )
{
Console.WriteLine(args.Method.Name + " : EX : " + args.Exception.Message );
}
}
Greg가 사용하는 주장은 속성에서 속성의 구현으로의 연결이 주니어 개발자에게 무슨 일이 일어나고 있는지 설명 할 수 없을 정도로 "매우 마술"이라는 것입니다. 초기 예제는 모두 "단순한 코드"이며 쉽게 설명 할 수 있습니다.
그래서 다소 오래 전부터 쌓여온 문제는 언제 프레임 워크가 아닌 Greg에서 AOP에 PostSharp와 같은 것을 사용하도록 전환 할 것인가?
IConsumes
입니다. 외부 XML 또는 일부 Fluent 인터페이스를 사용하지 않고 배우는 것이 좋습니다. 이 방법론은 "배워야 할 또 다른 것"이라고 주장 할 수 있습니다.