PostSharp - il переплетающийся - мысли

public class CountMaxFlatFileItemReader extends FlatFileItemReader {

    private int counter;

    private int maxCount;

    public void setMaxCount(int maxCount) {
        this.maxCount = maxCount;
    }

    @Override
    public Object read() throws Exception {
        counter++;
        if (counter >= maxCount) {
            return null; // this will stop reading
        }
        return super.read();
    }
}

Что-то вроде этого должно работать. Читатель перестает читать, как только возвращается null.

10
задан Scott Dorman 18 September 2008 в 11:43
поделиться

4 ответа

Я применяю вход с AOP с помощью замка Windsor DynamicProxies. Я уже использовал Замок, поскольку это - контейнер МОК, так использование его для AOP было путем наименьшего количества сопротивления для меня. Если Вы хотите больше сообщенной мне информации, я нахожусь в процессе уборки кода для выпуска ее как сообщение в блоге

Править

Хорошо, вот основной код Перехватчика, умирающим образом основной, но он делает все, в чем я нуждаюсь. Существует два перехватчика, каждый регистрирует everyhing, и другой позволяет Вам определять имена методов для обеспечения более мелкомодульного входа. Этим решением является умирающим образом иждивенец на замке Windsor

Абстрактный базовый класс

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

Полный вход Implemnetation

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);
    }
}
}
7
ответ дан 3 December 2019 в 18:37
поделиться

+1 на пострезком. Использовали для нескольких вещей (включая некоторые попытки на добавляющих предварительных условиях и постусловиях к коду C#) и не знают, как я сделал бы его без него...

6
ответ дан 3 December 2019 в 18:37
поделиться

Это зависит до степени от того, сколько времени Вы будете разрабатывать и поддерживать проект для. Несомненно, переплетение IL является хорошей технологией, но что происходит, если IL и/или изменения формата метаданных блока снова (как это сделало между 1,1 и 2.0) и те изменения делают инструмент несовместимым с новым форматом.

Если Вы зависите от инструмента затем, он препятствует тому, чтобы Вы обновили свою технологию, пока инструмент не поддерживает его. Без гарантий на месте об этом (или даже что разработка продолжится, хотя это действительно кажется вероятным) затем я был бы очень осторожен об использовании его на долгосрочном проекте.

Короткий срок, без проблем все же.

5
ответ дан 3 December 2019 в 18:37
поделиться

Использовали его, чтобы сделать точно это. Работает отлично! Я настоятельно рекомендовал бы его!

3
ответ дан 3 December 2019 в 18:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: