2011-07-11 103 views
4

我在spring.net论坛发布了以下内容,但也希望我可以在这里获得一些价值观点:我怎样才能spring.net注入方法?

我在寻找一些建议,以了解如何实现以下要求。首先是一些背景 - 我使用Spring.NET来实现IOC depdenecny注入到我的asp.net c#多层web应用程序中。注入是通过spring.net xml配置文件来实现的,我的所有开发都是通过针对接口进行开发并在需要的接口实现类中进行注入来实现的。这一切都适合我。我的知识是我相信的中间水平。

我遇到了这个问题,并希望为它实现解决方案。

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

我想有自由注入到每个方法的缓存的特点,例如。时间让它生活在缓存等。所以,而不是注入到所需的类,我也希望能够注入方法的值。

我可以沿着在每个方法的类创建属性的方法,但这得到messay,或注入到我的课设置。我的首选是通过弹簧注射来控制每种方法。

所以任何想法如何实现这一点,因为我期望它可能会比别人的东西可能遇到。

我想出了一个可能的想法是以某种方式通过spring为每个方法注入一个属性,该属性具有该方法所需的值的属性,例如缓存持续时间等。这是一个可行的解决方案吗?如果是这样,任何人都可以帮助我配置这样的。

或者如果任何人有任何其他的想法,这将是伟大的。

回答

6

如果你采取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使用值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.NET documentation on AOP