2011-07-11 22 views
4

私はspring.netフォーラムで次のように投稿しましたが、ここでいくつかの価値観を得ることを期待しました:spring.netはどのようにメソッドに挿入できますか?

私は次の要件を達成する方法についていくつかアドバイスをしています。

まず、いくつかの背景 - 私はasp.net C#マルチティアWebアプリケーションにIOC depdenecnyインジェクションを実現するためにSpring.NETを使用しています。注入はspring.net xmlの設定ファイルを使って行います。私の開発はすべて、インターフェースに対して開発し、必要なところでインターフェース実装されたクラスに注入することで実現します。これはすべて私にとってうまくいく。私の知識は私が信じる中間的なレベルになるでしょう。

私は問題に走り込み、解決策を探しています。

たとえば、私はデータベースからデータを取得するいくつかのメソッドを持つクラスを用意しています。データはある期間キャッシュされています。

私は、各メソッドにキャッシングの特性などを自由に注入したいと思っています。それが必要な場所にクラスで注入するのではなく、メソッドに値を注入できるようにしたいと考えています。

私は各メソッドのクラスのプロパティを作成するアプローチに進むことができますが、これはmessayを取得したり、自分のクラスに設定を注入したりします。私の好みはスプリングインジェクションで各メソッドを制御することです。

私はそれが他のものよりも何かを遭遇するかもしれないと思うので、どのようにこれを達成することができるアイデア。

私が思いついた考え方のひとつは、メソッドに必要な値(例:キャッシュの長さなど)を持つ属性を持つ属性を持つ春を介して、各メソッドに属性を何らかの形で注入することです。これは実現可能な解決策ですか?もしそうなら、誰も私のような設定で私を助けることができます。

他のアイデアがあれば、それは素晴らしいことでしょう。

答えて

6

bbaiaのアプローチをとると、以下のようになります。 これは少し簡略化されていますが、状況に合わせて適用することができます。 のは、我々は、単一のパラメータtimeとのインターフェースIDoWorkForSomeTimeを持っていると仮定しましょう:

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を、使用しています。春のコンテナが[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をご覧ください。

0

Spring.NET AOPを試すことができます。実行時にメソッドパラメータを変更できます。

関連する問題