`
limingnihao
  • 浏览: 1824533 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring.net + FluorineFx 项目搭建 之 二、后台功能编写

阅读更多

二、C#功能编写(模拟用户登陆功能)

2.1 需要编写的类

2.1.1需要编写的类文件列表为

用户实体类User
数据操作类UserDao。实现AdoDaoSupport接口。
SQL资源文件CommandSQL.resx
逻辑功能借口类 IGeneralService。
逻辑功能类 GeneralService,实现IUserService接口。

 

2.1.2三种代码注入类

InterceptorMethod,         实现IMethodInterceptor接口,          用于在方法执行前后,附加功能。
InterceptorThrow,           实现IThrowsAdvice接口,                  用于异常处理。
InterceptorTransaction,  实现IAfterReturningAdvice接口,       用于事物处理。


2.1.3一个标签类

GeneralAttribute继承System.Attribute。用户标记需要代码注入的方法。

 

2.2具体类的实现

2.2.1代码注入类写法

编写InterceptorMethod类,继承Attribute接口。可以在这个类中声明一些常量来标识,通过[InterceptorMethod (RequireUserLogon=true)] 来初始化标识。

使用时,在方法前添加标记[InterceptorMethod]
有四种代码注入形式:

 

接口名

注入方式

需要实现的方法

IMethodInterceptor

头尾注入

Invoke

IAfterReturningAdvice

结尾注入

AfterReturning

IThrowsAdvice

抛异常注入

AfterThrowing(不是接口方法)

IMethodBeforeAdvice

开始注入

 

 

下面写出三种常用代码注入。
⑴ InterceptorMethod.cs
执行方法前注入,一般用于方法执行前进行检查Session和记录日志等。

 

namespace Li.Aspects
{
    /// <summary>
    /// 代码注入,前后型
    /// </summary>
    public class InterceptorMethod : IMethodInterceptor
    {
        #region IMethodInterceptor 成员

        public object Invoke(IMethodInvocation invocation)
        {
            //得到当前实例化的ServiceMethodAttribute类的对象
            var attribute = (invocation.Method.GetCustomAttributes(typeof(GeneralAttribute), false).FirstOrDefault() as GeneralAttribute);

            User currentUser = (HttpContext.Current.Session["User"] as User);
            if (attribute != null && attribute.RequireUserLogon == true && currentUser == null)
            {
                throw new SessionTimeoutException();
            }
            return invocation.Proceed();
        }

        #endregion
    }
}

 

 

⑵ InterceptorThrow.cs,用于处理程序中的异常。

namespace Li.Aspects
{
    public class InterceptorThrow : IThrowsAdvice
    {
        public void AfterThrowing(MethodInfo method, object[] args, object target, Exception exception)
        {
            if (exception != null)
            {
                throw exception;
            }
        }
    }
}

 

 

 

⑶ InterceptorTransaction.cs,用于事务处理。

 

namespace Li.Aspects
{
    /// <summary>
    /// 方法后注入,用于进行事物管理
    /// </summary>
    public class InterceptorTransaction : IAfterReturningAdvice
    {
        #region IAfterReturningAdvice 成员

        public void AfterReturning(object returnValue, System.Reflection.MethodInfo method, object[] args, object target)
        {
            var attribute = (method.GetCustomAttributes(typeof(TransactionAttribute), false).FirstOrDefault() as TransactionAttribute);
            if (attribute != null && attribute.ReadOnly == false && 
                (method.ReturnType == typeof(bool) && bool.Equals(returnValue, false) || method.ReturnType == typeof(decimal) && decimal.Equals(returnValue, -1) || method.ReturnType == typeof(int) && int.Equals(returnValue, -1)))
            {
                TransactionInterceptor.CurrentTransactionStatus.SetRollbackOnly();
            }
        }

        #endregion
    }
}

 


2.2.2 普通代码注入标签类

用来标记,是否需要检查session。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Li.Attributes
{
    /// <summary>
    /// 标记类,用于标记代码注入
    /// </summary>
    public class GeneralAttribute : Attribute
    {
        public GeneralAttribute()
        {
            RequireUserLogon = true;
        }
        public Boolean RequireUserLogon
        {
            set;
            get;
        }
    }
}

 

 

 

2.2.3 事物处理标签的使用

使用Spring提供的类TransactionAttribute

 

1,在方法上添加标记

标记为ReadOnly = true,只读事物
标记为TransactionPropagation.Required,写操作事物。

 

2,事物处理类

每个方法执行完毕后,都会执行InterceptorTransaction类中的AfterReturning方法,通过方法的一些条件(如是否有

TransactionAttribute标签,返回值等)判断是否是否回滚。

 

一些判断条件:
a)        当attribute不为空
b)        当attribute不是只读事物
c)        当method.ReturnType类型是boo,值是false
d)        当method.ReturnType类型是数值类型,值是-1
则表示操作失败,进行回滚。

 

2.2.4 数据库调用功能(UserDao.cs)

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Spring.Data.Generic;
using Timecard.Data.Domain;
using System.Data;
using Oracle.DataAccess.Client;
using Timecard.Data.Resources;

namespace Timecard.Data.Access
{
    /// <summary>
    /// 用户,数据操作类
    /// </summary>
    class UserDao : AdoDaoSupport
    {
        #region 构造方法
        public UserDao()
        {
        }
        #endregion

        /// <summary>
        /// 根据用户名,得到用户对象
        /// </summary>
        /// <param name="userName"></param>
        /// <returns></returns>
        public User GetUserForUserName(string userName)
        {
            DataTable dataTable = AdoTemplate.Execute<DataTable>
                (
                    delegate(IDbDataAdapter dataAdapter)
                    {
                        if (dataAdapter is OracleDataAdapter)
                        {
                            OracleCommand commandToUse = (dataAdapter.SelectCommand as OracleCommand);
                            commandToUse.CommandText = CommandSQL.GetUserForUserName;
                            commandToUse.BindByName = true;

                            commandToUse.Parameters.Add(":USER_NAME", OracleDbType.NVarchar2, ParameterDirection.Input).Value = userName;

                            DataSet dataSet = new DataSet();
                            dataAdapter.Fill(dataSet);
                            return dataSet.Tables[0];
                        }
                        else
                        {
                            throw new Exception("Dao内部出现错误");
                        }
                    }
                );

            return (from dataRow in dataTable.AsEnumerable()
                    select new User
                    {
                        UserKey = dataRow.Field<decimal?>("USER_KEY"),
                        UserName = dataRow.Field<string>("USER_NAME"),
                        Password = dataRow.Field<string>("PASSWORD"),
                        RoleKey = dataRow.Field<decimal>("ROLE_KEY"),
                        Person = new Person
                        {
                            PersonKey = dataRow.Field<decimal?>("PERSON_KEY"),
                            PersonName = dataRow.Field<string>("PERSON_NAME").toNullString(),
                            PersonState = dataRow.Field<decimal?>("PERSON_STATE"),
                            PersonNickname = dataRow.Field<string>("PERSON_NICKNAME").toNullString(),
                            PersonPhoto = dataRow.Field<byte[]>("PERSON_PHOTO").Base64Encode(),
                            UnitKey = dataRow.Field<decimal?>("UNIT_KEY")
                            
                        }

                    }).FirstOrDefault();

        }
    }
}
 

 

 

2.2.5 SQL资源文件(CommandSQL.resx)

GetUserForUserName的SQL写法:

 

/* Formatted on 2010-5-27 9:24:29 (QP5 v5.114.809.3010) */
SELECT   U.USER_KEY,
         U.PERSON_KEY,
         U.USER_NAME,
         U.PASSWORD,
         U.ROLE_KEY,
         P.PERSON_NAME,
         P.PERSON_STATE,
         P.PERSON_NICKNAME,
         P.PERSON_PHOTO,
         P.UNIT_KEY
  FROM      UIMS.USER_TBL U
         LEFT JOIN
            UIMS.PERSON_TBL P
         ON U.PERSON_KEY = P.PERSON_KEY
 WHERE   U.USER_NAME = :USER_NAME

 

2.2.6 功能接口

IGeneralService.cs基本功能接口类:

namespace Timecard.Services.Interfaces
{
    /// <summary>
    /// 基本操作接口
    /// </summary>
    public interface IGeneralService
    {
        Object Logon(string userNameString, string passwordString);
        Boolean Logout();
    }
}

 

2.2.7 Service层功能实现类

服务层,登陆功能类GeneralService.cs:

namespace Timecard.Services
{
    class GeneralService : IGeneralService
    {
        private UserDao userDao;
        private PersonDao personDao;
        public string HashInstance{ get;set;}

        #region 构造方法     
        public GeneralService(UserDao userDao, PersonDao personDao)
        {
            this.userDao = userDao;
            this.personDao = personDao;
        }
        #endregion

        #region IGeneralService 成员

        /// <summary>
        /// 登录方法
        /// </summary>
        /// <param name="userNameString"></param>
        /// <param name="passwordString"></param>
        /// <returns></returns>
        [ServiceMethodAttribute(RequireUserLogon = false), TransactionAttribute(ReadOnly = true)]
        public Object Logon(string userNameString, string passwordString)
        {
            try
            {
                string userName = userNameString.TrimOrNull();
                User user = null;
                user = userDao.GetUserForUserName(userName);
                if (user == null)
                {
                    throw new NotHasUserException();
                }
                if (!Cryptographer.CompareHash(HashInstance, passwordString, user.Password))
                {
                    throw new InvalidPasswordException();
                }
                else
                {
                    HttpContext.Current.Session.Add("User", user);
                    return user;
                }
            }
            catch
            {
                throw new InvalidPasswordException();
            }
           
        }

        /// <summary>
        /// 注销
        /// </summary>
        [ServiceMethodAttribute(RequireUserLogon=false), TransactionAttribute(ReadOnly = true)]
        public Boolean Logout()
        {
            HttpContext.Current.Session.Clear();
            return true;
        }
        #endregion
    }
}

 

2.3将新加的类添加的对应的配置文件中

文件属性,生成操作:嵌入资源。不改此项会报错。
①Service类库配置文件

<?xml version="1.0" encoding="utf-8"?>
<objects xmlns="http://www.springframework.net">
 
  <object id="generalService" type="Timecard.Services.GeneralService, Timecard.Services">
    <constructor-arg ref="personDao" />
    <constructor-arg ref="userDao" />
    <property name="HashInstance" value="HashProvider" />
  </object>

</objects>

  

 

②DataAccess类库配置文件

<?xml version="1.0" encoding="utf-8"?>
<objects xmlns="http://www.springframework.net" xmlns:db="http://www.springframework.net/database">
  <object type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core">
    <property name="ConfigSections" value="dbSettings" />
  </object>

  <db:provider id="dbProvider" provider="Oracle.DataAccess.Client" connectionString="DATA SOURCE=${db.source};PERSIST SECURITY INFO=True;USER ID=${db.user};PASSWORD=${db.password};MAX POOL SIZE=100" />

  <object id="adoTemplate" type="Spring.Data.Generic.AdoTemplate, Spring.Data">
    <property name="DbProvider" ref="dbProvider" />
    <property name="DataReaderWrapperType" value="Spring.Data.Support.NullMappingDataReader, Spring.Data" />
  </object>

  <object id="transactionManager" type="Spring.Data.Core.AdoPlatformTransactionManager, Spring.Data">
    <property name="DbProvider" ref="dbProvider" />
  </object>

  <object id="userDao" type="Timecard.Data.Access.UserDao, Timecard.DataAccess">
    <property name="AdoTemplate" ref="adoTemplate" />
  </object>
  
</objects>

 

 

 

0
0
分享到:
评论

相关推荐

    跟我一步步搭建+Flex+FluorineFx+ASP[1].NET.doc

    总结来说,搭建Flex+FluorineFx+ASP.NET环境涉及安装多个组件,创建对应的项目,并在客户端和服务器端编写代码以实现数据通信。FluorineFx作为中间层,使得Flex应用能够无缝地与ASP.NET服务交互,从而提供强大的RIA...

    跟我一步步搭建+Flex+FluorineFx+ASP.NET整理.pdf

    搭建Flex+FluorineFx+ASP.NET的整合开发环境是一项技术性的工作,涉及多个关键组件的安装和配置。以下是一步步的详细说明: 一、安装软件与配置 1. **MyEclipse 6.0.1**:这是一款集成开发环境(IDE),用于Java、...

    跟我一步步搭建 Flex+FluorineFx+ASP.NET

    【Flex + FluorineFx + ASP.NET 搭建指南】 在现代Web开发中,富互联网应用程序(RIA)已经成为一种趋势,提供了丰富的用户体验。本文将详细介绍如何使用Flex作为前端开发工具,通过FluorineFx作为中间件来连接后端...

    Flex+.Net+Cairngorm+Fluorine的HelloWorld演示

    这个“Flex+.Net+Cairngorm+Fluorine的HelloWorld演示”旨在帮助开发者理解如何将这些技术整合在一起,实现跨平台的通信,并掌握Cairngorm框架的应用。 Flex 是一种基于ActionScript和MXML的开源框架,由Adobe提供...

    asp.net通过FluorineFx传DataTable到Flex

    通过FluorineFx,开发者可以轻松地在.NET环境中使用AMF(Action Message Format)协议,这是一种二进制数据格式,能够提高数据传输效率和性能。 **ASP.NET** 是微软开发的一种Web应用程序框架,用于构建动态网站、...

    flex+fluorinefx access交互测试

    **ACCESS数据库** 是Microsoft开发的一款关系型数据库管理系统,适用于小型企业或个人项目,易于使用且功能相对全面。在Flex应用中,ACCESS数据库可以作为存储和管理数据的后端平台。 在"flex+fluorinefx access...

    在线拍照 c# flex+fluorineFx+webservices

    标题中的“在线拍照 c# flex+fluorineFx+webservices”揭示了这是一个基于C#技术,使用Flex前端和FluorineFx作为SOAP Web服务客户端库的在线拍照系统。让我们详细了解一下这些关键技术点。 **C#(Sharp)**: C#是...

    Flex 4 asp.net VS2010 FluorineFX

    Flex 4、ASP.NET 和 FluorineFX 是用于构建富互联网应用程序(RIA)的强大技术组合。在本教程中,我们将探讨如何使用Visual Studio 2010(VS2010)作为集成开发环境(IDE),结合FluorineFX这一开源的Adobe Flex到...

    c#使用的FluorineFx.net必须dll库,rtmp协议通信相关

    开发的时候,只需要将5个dll导入就可以了,安装程序是从官网上下载的FluorineFx.net安装程序,版号是1.0.0.15。 导入5个dll之后,就可以用c#按照官网上的教程进行rtmp协议进行通信了,不过教程上对于rtmp协议的用法...

    FluorineFx.NET Rtmp服务端.rar

    FluorineFx.NET RTMP服务端是一款专为.NET开发者设计的开源RTMP服务器软件,它使得在.NET平台上构建实时媒体流应用变得简单易行。RTMP(Real-Time Messaging Protocol)是一种广泛应用于在线流媒体传输的技术,常...

    FluorineFx C#搭建简单小例子

    FluorineFx是.NET平台上一个开源的Adobe Flash Remoting实现,它允许C#开发者与Flash客户端进行双向通信,使得Flex、Flash等基于ActionScript的应用能够无缝地与服务器端的.NET服务交互。在这个"FluorineFx C#搭建...

    Flex(PureMVC) asp.net FluorineFx操作数据库

    标题中的“Flex(PureMVC) asp.net FluorineFx操作数据库”表明这是一个关于使用Adobe Flex(一种基于ActionScript的前端开发框架)与后端ASP.NET通过FluorineFx进行数据交互并操作数据库的项目。以下是相关知识点的...

    flex与.net通信的FluorineFx模板

    2. 在.NET项目中配置FluorineFx,定义要暴露给Flex的远程服务。 3. 创建Flex应用,并设置相应的Remoting配置,指定服务器地址和要调用的服务。 4. 在ActionScript代码中,通过RemoteObject或WebService组件调用.NET...

    Flex与ASP.Net通信(FluorineFx)程序例子

    FluorineFx 是一个开源的AMF(Action Message Format)网关,它可以将Flex与ASP.NET无缝对接,提供高效的二进制数据传输,提高了应用性能。 首先,我们需要理解Flex和ASP.NET各自的角色。Flex作为客户端展示层,...

    在VS2010上用FluorineFX和Flex 4开发项目(asp.net)

    2. **安装FluorineFX**:从FluorineFX官网下载并安装最新版本,它会为ASP.NET项目提供AMF服务支持。 3. **设置FluorineFX模板**:打开VS2010,安装提供的`FluorineFXTemplate.vsix`扩展,这将为VS添加FluorineFX项目...

    真正调试可用的FluorineFx+.NET视频聊天室源码

    通过研究和理解这个FluorineFx+.NET视频聊天室源码,开发者不仅可以学习到如何利用FluorineFx搭建服务器和客户端通信,还能掌握实时音视频处理、多用户同步和网络编程等相关技能。对于想要深入.NET与Flash集成,或者...

    flex net sql2005 增删改查 仿goog百度搜索

    FLEX3+.NET +FLUORINEFX 后台数据sql2005 公司做进销存的一个项目 一、FLUORINEFX经典入门技术 数据库交互 二、查询带有autocomplete功能 三、组件式开发实现切换时的过渡效果 四、ComboBox下拉树形结构 截图请登录...

    在vs2010上安装FluorineFX项目模板

    在进行Flex项目的开发时,开发者可能会需要FluorineFX,这是一个开源的.NET与Adobe Flex之间的AMF(Action Message Format)通信框架。然而,默认情况下,VS2010的新建项目模板中并未包含FluorineFX。本文将详细解释...

    FluorineFx + Flash + VS2010 交互配置方式与实例

    FluorineFx是一款开源的.NET到Flash Remoting框架,它允许.NET应用程序与Adobe Flash Player进行无缝通信。本文档将详细介绍如何在Visual Studio 2010环境下配置FluorineFx,以及如何实现两者之间的交互实例。 首先...

Global site tag (gtag.js) - Google Analytics