2011-07-11 112 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