我如何在spring.net注入到方法

本文关键字:注入 方法 net spring | 更新日期: 2023-09-27 18:01:52

我在spring.net论坛上发布了以下内容,但也希望我可以在这里获得一些有价值的观点:

我正在寻找一些建议,我如何才能达到以下要求。

首先是一些背景-我正在使用Spring。在我的asp.net c#多层web应用程序中实现IOC依赖注入。注入是通过spring.net xml配置文件实现的,我的所有开发都是通过针对接口进行开发并在需要的地方注入接口实现类来实现的。这对我来说都很好。我相信我的知识是中等水平。

我遇到了这个问题,正在寻找解决方案。

举个例子,我有一个类,它有几个方法,它们都从数据库中检索,数据被缓存一段时间。

我希望能够自由地将缓存的特性注入到每个方法中。是时候把它保存在缓存中了。因此,与其将类注入到需要的地方,我还希望能够将值注入到方法中。

我可以沿着为每个方法在类上创建属性的方法,但这会变得混乱,或者将设置注入到我的类。我倾向于通过弹簧注入来控制每个方法。

有什么想法可以实现这一点,因为我期望它比其他人可能遇到的东西。

我提出的一个可能的想法是以某种方式注入一个属性到每个方法上,通过spring的属性具有方法中所需的值,例如缓存持续时间等。这是一个可行的解决方案吗?如果有,谁能帮我配置一下。

我如何在spring.net注入到方法

如果有人有其他的想法,那就太好了。

如果您采用bbaia的方法,它可能看起来像下面的示例。这有点简化了,但你可以把它应用到你的情况中。假设我们有一个接口IDoWorkForSomeTime,它只有一个参数time:

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

TimeBoundWorkerAdvisedTimeBoundWorker实现:

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使用我在spring配置文件中配置的值8。spring容器看到[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。净AOP。你可以在运行时修改方法参数