Domanda

Sto valutando la possibilità di utilizzare Postsharp quadro per facilitare l'onere di applicazione del metodo di registrazione.Fondamentalmente mi permette di abbellire metodi di registrazione e di attributo in fase di compilazione, si inietta il codice di registrazione necessaria in il.Mi piace questa soluzione, in quanto mantiene il rumore del degnati di codice di tempo in ambiente.Tutti i pensieri, esperienze o alternative migliori?

È stato utile?

Soluzione

Ho applicato la registrazione con AOP utilizza il Castello di Windsor DynamicProxies.Stavo già usando Castello per IoC container, in modo da utilizzarla per AOP è stato il percorso di minor resistenza per me.Se vuoi maggiori info fammi sapere, io sono nel processo di riordino del codice per la liberazione come un post sul blog

Modifica

Ok, ecco la base Intercepter codice, tutto di base, ma fa tutto quello di cui ho bisogno.Ci sono due intercepters, si accede everyhing e l'altro permette di definire il metodo di nomi per consentire più a grana fine registrazione.Questa soluzione è del tutto dipendente dal Castello di Windsor

Classe di Base astratta

namespace Tools.CastleWindsor.Interceptors
{
using System;
using System.Text;
using Castle.Core.Interceptor;
using Castle.Core.Logging;

public abstract class AbstractLoggingInterceptor : IInterceptor
{
    protected readonly ILoggerFactory logFactory;

    protected AbstractLoggingInterceptor(ILoggerFactory logFactory)
    {
        this.logFactory = logFactory;
    }

    public virtual void Intercept(IInvocation invocation)
    {
        ILogger logger = logFactory.Create(invocation.TargetType);

        try
        {
            StringBuilder sb = null;

            if (logger.IsDebugEnabled)
            {
                sb = new StringBuilder(invocation.TargetType.FullName).AppendFormat(".{0}(", invocation.Method);

                for (int i = 0; i < invocation.Arguments.Length; i++)
                {
                    if (i > 0)
                        sb.Append(", ");

                    sb.Append(invocation.Arguments[i]);
                }

                sb.Append(")");

                logger.Debug(sb.ToString());
            }

            invocation.Proceed();

            if (logger.IsDebugEnabled && invocation.ReturnValue != null)
            {
                logger.Debug("Result of " + sb + " is: " + invocation.ReturnValue);
            }
        }
        catch (Exception e)
        {
            logger.Error(string.Empty, e);
            throw;
        }
    }
}
}

Registrazione Completa Implemnetation

namespace Tools.CastleWindsor.Interceptors
{
using Castle.Core.Logging;

public class LoggingInterceptor : AbstractLoggingInterceptor
{
    public LoggingInterceptor(ILoggerFactory logFactory) : base(logFactory)
    {
    }
}
}

Metodo di registrazione

namespace Tools.CastleWindsor.Interceptors
{
using Castle.Core.Interceptor;
using Castle.Core.Logging;
using System.Linq;

public class MethodLoggingInterceptor : AbstractLoggingInterceptor
{
    private readonly string[] methodNames;

    public MethodLoggingInterceptor(string[] methodNames, ILoggerFactory logFactory) : base(logFactory)
    {
        this.methodNames = methodNames;
    }

    public override void Intercept(IInvocation invocation)
    {
        if ( methodNames.Contains(invocation.Method.Name) )
            base.Intercept(invocation);
    }
}
}

Altri suggerimenti

+1 su postsharp.Sono state usando per varie cose (tra cui alcuni tentativi in aggiunta precondizioni e postcondizioni per il codice C#) e non so come farei senza di esso...

Essa dipende in grande misura su quanto tempo sarete in via di sviluppo e a sostegno del progetto per.Certo, IL la tessitura è una bella tecnologia, ma cosa succede se il e/o di montaggio formato di metadati cambia ancora (come ha fatto tra 1.1 e 2.0) e tali modifiche rendono lo strumento compatibile con il nuovo formato.

Se si dipende sullo strumento quindi impedisce di aggiornare la vostra tecnologia, fino a quando lo strumento supporta.Non ci sono garanzie in atto su questo (o anche che lo sviluppo continuerà, anche se sembra probabile) quindi sarei molto cauto circa l'utilizzo su un progetto a lungo termine.

A breve termine, nessun problema.

L'ho utilizzata per fare esattamente questo.Funziona alla grande!Mi raccomando è!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top