سؤال

أفكر في استخدام إطار عمل Postsharp لتخفيف عبء تسجيل طريقة التطبيق.إنه يسمح لي بشكل أساسي بتزيين الأساليب بسمة التسجيل وفي وقت الترجمة يقوم بإدخال رمز التسجيل المطلوب في الملف.يعجبني هذا الحل لأنه يبعد الضوضاء عن بيئة كود وقت التصميم.أي أفكار أو تجارب أو بدائل أفضل؟

هل كانت مفيدة؟

المحلول

أقوم بتطبيق التسجيل باستخدام AOP باستخدام Castle Windsor DynamicProxies.كنت أستخدم Castle بالفعل لحاوية IoC الخاصة بها، لذلك كان استخدامها لـ AOP هو المسار الأقل مقاومة بالنسبة لي.إذا كنت تريد المزيد من المعلومات، فأخبرني، فأنا بصدد تنظيم الكود لإصداره كمقالة مدونة

يحرر

حسنًا، هذا هو رمز Intercepter الأساسي، وهو أساسي بشكل فاشل ولكنه يفعل كل ما أحتاجه.هناك نوعان من أجهزة الاعتراض، أحدهما يسجل كل شيء والآخر يسمح لك بتحديد أسماء الطرق للسماح بتسجيل أكثر دقة.هذا الحل يعتمد بشكل فاشل على قلعة وندسور

مجردة الطبقة الأساسية

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;
        }
    }
}
}

تنفيذ التسجيل الكامل

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

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

تسجيل الطريقة

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);
    }
}
}

نصائح أخرى

+1 على بوست شارب.لقد تم استخدامه لعدة أشياء (بما في ذلك بعض المحاولات لإضافة الشروط المسبقة والشروط اللاحقة إلى كود C#) ولا أعرف كيف سأفعل ذلك بدونها ...

يعتمد ذلك إلى حد ما على المدة التي ستستغرقها في تطوير المشروع ودعمه.بالتأكيد، يعد نسج IL تقنية رائعة، ولكن ماذا يحدث إذا تغير تنسيق بيانات تعريف IL و/أو التجميع مرة أخرى (كما حدث بين 1.1 و2.0) وهذه التغييرات تجعل الأداة غير متوافقة مع التنسيق الجديد.

إذا كنت تعتمد على الأداة، فإنها تمنعك من ترقية التكنولوجيا الخاصة بك حتى تدعمها الأداة.مع عدم وجود ضمانات بشأن هذا (أو حتى أن هذا التطوير سيستمر، على الرغم من أنه يبدو مرجحًا) فسأكون حذرًا جدًا بشأن استخدامه في مشروع طويل المدى.

على المدى القصير، لا توجد مشكلة بالرغم من ذلك.

لقد استخدمته للقيام بهذا بالضبط.يعمل بشكل رائع!أنا أوصي به بشدة!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top