Как я могу добавить Spring.net в методы? - PullRequest
4 голосов
/ 12 июля 2011

Я написал в фолловер на форуме spring.net, но также надеялся, что у меня могут появиться некоторые полезные мнения:

Я ищу несколько советов о том, как мне выполнить следующее требование.

Во-первых, немного предыстории - я использую Spring.NET для обеспечения депонентного внедрения IOC в мое многоуровневое веб-приложение asp.net c #.Инъекция выполняется через конфигурационный файл Spring.net xml, и все мои разработки были достигнуты путем разработки на основе интерфейсов и внедрения в класс, реализованный на интерфейсе, где это необходимо.Это все прекрасно работает для меня.Я полагаю, что мои знания будут среднего уровня.

Я столкнулся с проблемой и ищу решение этой проблемы.

Например, у меня есть класс с несколькими методами, где онивсе извлекаются из базы данных, данные кешируются в течение определенного периода времени.

Я хочу иметь возможность вводить в каждый метод характеристики кэширования, например.время для того, чтобы он находился в кеше и т. д. Поэтому вместо того, чтобы внедрять в класс туда, где это требуется, я также хочу иметь возможность вводить значения в методы.

Я мог бы пойти по пути создания свойств в классе для каждого метода, но это мешает или вводит в настройках мой класс.Я предпочитаю контролировать каждый метод с помощью пружинного впрыска.

Так что любые идеи о том, как этого можно достичь, ожидая чего-то, с чем другие могли столкнуться.

Одна возможная идея, которую я выдвинулс помощью какого-либо метода вставки атрибута в каждый метод через пружину с атрибутом, имеющим свойства со значениями, которые требуются в методе, например, длительность кэша и т. д. Является ли это возможным решением?Если да, может ли кто-нибудь помочь мне с настройкой такого.

Или, если у кого-то есть другие идеи, было бы здорово.

Ответы [ 2 ]

6 голосов
/ 15 июля 2011

Если вы используете подход bbaia, это может выглядеть как пример ниже. Это немного упрощено, но вы можете применить его к вашей ситуации. Давайте предположим, что у нас есть интерфейс IDoWorkForSomeTime с одним параметром time:

public interface IDoWorkForSomeTime
{
    void Work(int time);
}

Это реализовано TimeBoundWorker и AdvisedTimeBoundWorker:

public class TimeBoundWorker : IDoWorkForSomeTime
{
    public void Work(int time)
    {
        Console.WriteLine("Working for {0} hours", time);
    }
}

public class AdvisedTimeBoundWorker : IDoWorkForSomeTime
{
    /* *** Note The Attribute *** */
    [ChangeParameter]
    public void Work(int time)
    {
        Console.WriteLine("Working for {0} hours", time);
    }
}

Затем мы можем настроить прокси AOP для изменения параметра времени во время выполнения, так что когда мы запускаем следующую программу:

class Program
{
    static void Main(string[] args)
    {
        IApplicationContext ctx = new XmlApplicationContext("objects.xml");
        var worker = (IDoWorkForSomeTime)ctx.GetObject("plainWorker");
        var advisedWorker = (IDoWorkForSomeTime)ctx.GetObject("advisedWorker");

        worker.Work(4);
        advisedWorker.Work(4);
    }
}

Выводит:

Working for 4 hours
Working for 8 hours

Так что, хотя я и называю это значением 4, advisedWorker использует значение 8, которое я настроил в своем весеннем конфигурационном файле. Контейнер пружины видит атрибут [ChangeParameter] и из моей конфигурации знает, что он должен применить следующий метод-перехватчик:

public class ChangeParamInterceptor : IMethodInterceptor
{
    public int NewValue { get; set; }  // set in spring cofig

    public object Invoke(IMethodInvocation invocation)
    {
        invocation.Arguments[0] = NewValue; // change the argument
        object rval = invocation.Proceed();
        return rval;
    }
}

Требуется эта конфигурация пружины в objects.xml:

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">

  <object id="plainWorker"
          type="Examples.Aop.Shared.TimeBoundWorker, Examples.Aop.Shared"
          singleton="true">
  </object>

  <object id="advisedWorker"
          type="Examples.Aop.Shared.AdvisedTimeBoundWorker, Examples.Aop.Shared"
          singleton="true">
  </object>

  <!-- AOP configuration: -->

  <object id="changeParamAdvice"
          type="Examples.Aop.Shared.ChangeParamInterceptor, Examples.Aop.Shared">
    <!-- AH! there's the 8 -->
    <property name="NewValue" value="8" />
  </object>

  <object id="attributePointcut" type="Spring.Aop.Support.AttributeMatchMethodPointcut, Spring.Aop">
    <property name="Attribute" value="Examples.Aop.Shared.ChangeParameterAttribute, Examples.Aop.Shared" />
  </object>

  <object id="changeParamAspect" type="Spring.Aop.Support.DefaultPointcutAdvisor, Spring.Aop">
    <property name="Pointcut" ref="attributePointcut" />
    <property name="Advice" ref="changeParamAdvice"/>
  </object>

  <object id="ProxyCreator" 
          type="Spring.Aop.Framework.AutoProxy.DefaultAdvisorAutoProxyCreator, Spring.Aop" />     
</objects>

У вас есть намного больше возможностей для настройки AOP и применения советов, таких как ChangeParamInterceptor. Подробнее читайте в Spring.NET документации по AOP .

0 голосов
/ 12 июля 2011

Вы можете попробовать использовать Spring.NET AOP .Вы можете изменить параметры метода во время выполнения.

...