Spring.netを使う

12268 ワード

AOPはポイントサービスを実現します.
前言:
        AOP(Asppect Oriented Prograamming)は方面に向かってプログラミングしています.もし検索可能なものが分からないなら.AOPの目的はシステムを機能によって横に切り分け、切り分けられた機能、すなわち向いている面であり、例えばシステムのログ処理、安全、事物など、ASP.NET MVCのFiltersはAOPの思想実現である.AOPのメリットは何ですか?AOPは対象設計原則における単一職責(SAP)の体現であり、各モジュール間の結合度を効果的に低減し、システム全体の健康と効果的に各種需要の変化を防ぐことができる.
        本稿で紹介したポイントサービスはある団体購入サイトのモジュールであり、必要は複雑ではない.
  • は、いくつかの機能点でユーザの積分を変更する.例えば、ユーザー登録時にポイントを追加し、ユーザー取引が成功した時にユーザーにポイントを追加し、ユーザーが退団する時にポイントを減少させる.
  • 機能点と具体的な積分値は構成可能である.ポイントは製品のライフサイクルによって調整されますので、ポイント戦略を効率的に素早くコントロールすることができます.
  •         Spring.netはアプリケーション開発の枠組みであり、基本としてIOC、AOPおよびその上に広がるデータアクセス層のサポート、WEBサポート、サービスサポートなどの一連のアプリケーション開発におけるソリューションを提供しています.Spring.netで制御権を得て、切り込みポイントでAOPを実現することができます.
    実装:
    まず、本プロジェクトの構造と背景を紹介します.
  • 標準の三層構造は、各層がインターフェース抽象を行い、各層は抽象すなわちインターフェースに依存している.
  • WEB端はASP.NET MVCを使用しています.MVCの特性のため、各機能点は基本的に一つの方法に対応しています.このような粒度は機能点と積分項目との結合に有利です.
  • はSpring.netを使ってIOC容器を作り、各層の依存関係に注入する.
  • 上記の条件があったらSpring.net AOPを使ってポイントサービスを実現するには、以下のステップが必要です.
  • ポイントサービスクラス
  • を作成します.
    インテグラルサービスクラスの職責は、インテグラルの変更、インテグラルの履歴の照会などを含む積分に関する処理ロジックをパッケージ化することである.私たちのところではそれについて抽象的なものを作った.
        public interface IScoreService
    
    {
    
    void Record(SiteUser user,int scoreValue, ScoreEvent scoreEvent,string data);
    
    }
    実装クラス:
     public class ScoreService:IScoreService
    
    {
    
    public ISiteUserDao SiteUserDao { get; private set; }
    
    public IScoreItemDao ScoreItemDao { get; set; }
    
    public ScoreService(ISiteUserDao siteUserDao, IScoreItemDao scoreItemDao)
    
    {
    
    SiteUserDao = siteUserDao;
    
    ScoreItemDao = scoreItemDao;
    
    }
    
    [Transaction]
    
    public void Record(SiteUser user, int scoreValue, ScoreEvent scoreEvent,string data)
    
    {
    
    if (user == null) throw new ArgumentNullException("user");
    
    user.Score += scoreValue;
    
    if (user.Score < 0) throw new Exception("    ");
    
    //todo:
    
    var si = new ScoreItem { ForUser = user, HappeningTime = DateTime.Now.ChinaTime(), Score = scoreValue, ScoreEvent = scoreEvent,Data=data};
    
    ScoreItemDao.Insert(si);
    
    
                SiteUserDao.Update(user);
    
    }
    その でもSiteUserDaoとスコアItemDaoはデータアクセス インターフェースであり、 な はSpring.netを して に されます.「Transaction」というAttributeに している がいるかもしれませんが、これはSpring.netの への です. はhttp://www.springframework.net/doc-latest/reference/html/transaction.htmlを してください.
  • ポイントポリシーエンティティクラス
  • を します.
    クラスはエンティティクラスであり、 と のマッピング を している. プロジェクトでは、ポイントポリシーをIOC に しています.もちろん、 に じてデータベースに することもできます.
        /// <summary>
    
    ///     
    
    /// </summary>
    
    public class ScorePolicy
    
    {
    
    
            /// <summary>
    
    ///     
    
    /// </summary>
    
    public string PolicyName { get; set; }
    /// <summary>
    
    ///     
    
    /// </summary>
    
    public ScoreEvent ScoreEvent{get;set;}
    
    /// <summary>
    
    ///   
    
    /// </summary>
    
    public int ScoreValue { get; set; }
    
    //    id    note:spring.net expresstion
    
    public string GetUserIdExpr { get; set; }
    
    //          note:spring.net expresstion
    
    public string GenDataExpr { get; set; }
    
    }
    が なのは、 の2 のメンバーGetUserIdExprとGenData Exprで、この2 のメンバーはSpring.netの を しています. は、http://www.springframework.net/doc-latest/reference/html/expressions.htmlを してください.この2 のメンバーの は、 ロジックとは なく、サポートメンバーです. で クラスでそれらを ます.
  • カットインポイント
  • を します.
    Spring.netのために ストリームをブロックする を します.Spring.netは な り み と な り み をサポートしています. な り みには の り み と の り み が まれています. には、http://www.springframework.net/doc-latest/reference/html/aop.html#aop-pointcutsを してください. プロジェクトは の り み 、つまり.netのAttribute を しています.
       public class ScoreAttribute:Attribute
    
    {
    
    /// <summary>
    
    ///    ,         
    
    /// </summary>
    
    public string PolicyName { get; set; }
    
    }
    これはAttributeの なメンバーが まれています.ポリシー は、Attributeを に するときにポリシーエンティティを して します.
  • クラスを します.
  • Spring.netが された ストリーム のメッセージをブロックすると、 された で が されます.Srping.net AOPは4つの をサポートしています.
  •  
  • サラウンド
  • は、http://www.springframework.net/doc-latest/reference/html/aop.html#aop-advice-typesを してください. プロジェクトは を してポイント 、つまりブロックされた の に が します.
     public class ScoreAfterAdvice :
    
    
    Spring.Aop.IAfterReturningAdvice
    
    {
    
    public IScoreService ScoreService { get; set; }
    
    /// <summary>
    
    ///      ,
    
    /// </summary>
    
    private static IDictionary<string , ScorePolicy> _policies;
    
    public ScoreAfterAdvice(IDictionary<string, ScorePolicy> policies)
    
    {
    
    _policies = policies;
    
    }
    
    public void AfterReturning(object returnValue, MethodInfo method, object[] args, object target)
    
    {
    
    var attr = method.GetCustomAttributes(typeof(ScoreAttribute), false).FirstOrDefault() as ScoreAttribute;
    
    if (attr == null) throw new NullReferenceException();
    
    var keyname=string.IsNullOrEmpty(attr.PolicyName) ? method.Name : attr.PolicyName;
    
    if(!_policies.ContainsKey(keyname)) return; //todo:record log
    
    //      
    
    var policy = _policies[keyname];
    
    try
    
    {
    
    //      ID
    
    var user = ExpressionEvaluator.GetValue(args, policy.GetUserIdExpr);
    
    if (user != null)
    
    {
    
    var data = string.IsNullOrEmpty(policy.GenDataExpr) ? string.Empty : ExpressionEvaluator.GetValue(args, policy.GenDataExpr);
    
    //    
    
    ScoreService.Record((SiteUser) user, policy.ScoreValue, policy.ScoreEvent,data.ToString() );
    
    }
    
    }
    
    catch (Exception e)
    
    {
    
    //todo:log
    
    }
    
    }
    
    }
    このクラスはString.Aop.IAfterReturningAdvice を しました. が した にAfterReturning を び します.ここにはいくつかの なパラメータがあります.
  •  
  • return Valueは、ブロックされた の り は、 できません.
  • method、 び しられた .
  • args、 パラメータ
  • コードは ではありません.これらのパラメータを したコラボレーションが られます.
  • ( )
  • すべての は に けています. たちは の を して、それを させる があります.この は にSpring.net によって され、その は の りである.
     <aop:config >
    
    <aop:advisor advice-ref="ScoreAfterAdvice" pointcut-ref="ScoreAttributePointcut"/>
    
    </aop:config>
    
    <object id="ScoreAfterAdvice" type="GroupPurchase.Services.Score.Handler.ScoreAfterAdvice,GroupPurchase.Services">
    
    <description>   afteradvice</description>
    
    <constructor-arg name="policies">
    
    <dictionary key-type="string" value-type="GroupPurchase.Services.Score.Handler.ScorePolicy,GroupPurchase.Services">
    
    <entry key="CreateSiteUser"><!--    -->
    
    <object type="GroupPurchase.Services.Score.Handler.ScorePolicy,GroupPurchase.Services">
    
    <property name="GetUserIdExpr" value="[0]"/>
    
    <property name="GenDataExpr" value=""/>
    
    <property name="ScoreValue" value="10"/>
    
    <property name="ScoreEvent" value="1"/>
    
    </object>
    
    </entry>
    
    </dictionary>
    
    </constructor-arg>
    
    <property name="ScoreService" ref="ScoreService"/>
    
    </object>
    
    <object id="ScoreAttributePointcut" type="Spring.Aop.Support.AttributeMatchMethodPointcut">
    
    <property name="Attribute" value="GroupPurchase.Services.Score.Handler.ScoreAttribute,GroupPurchase.Services" />
    
    </object>
    たちはポイントポリシーを しています.ユーザー が したら、ユーザーのために10ポイントを します.スコア・アフィリエイトクラスのためにポイントポリシー とポイントサービスを します.もう つのadvisorを しました.これは り み と のマッピング です. はコードを て、 しく しません.
  • を します.
    のステップの り しを て、 はポイントシステムを し わったと えますが、どうやって えばいいですか?2ステップ :
  • の に じて を し、 のステップを してください.
  • は、 する にAttributeを し、 えば、サービス におけるユーザ のコードセグメント:
  •         [Notify(EventId = "AccountRegistered")]
    
    [Score]
    
    [Transaction]
    
    public void CreateSiteUser(SiteUser user)
    
    {
    
    SiteUserDao.Insert(user);
    
    }
    :
    ポイントサービスを いて、このプロジェクトの サービスもAOP で しました. にAOPは に の をもたらしましたが、 はフレームに する が いです.もしSpring.netをEntLibに えるなら、 ず のコードを き えなければなりません. の のご を し、 に します.