二、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>
分享到:
相关推荐
总结来说,搭建Flex+FluorineFx+ASP.NET环境涉及安装多个组件,创建对应的项目,并在客户端和服务器端编写代码以实现数据通信。FluorineFx作为中间层,使得Flex应用能够无缝地与ASP.NET服务交互,从而提供强大的RIA...
搭建Flex+FluorineFx+ASP.NET的整合开发环境是一项技术性的工作,涉及多个关键组件的安装和配置。以下是一步步的详细说明: 一、安装软件与配置 1. **MyEclipse 6.0.1**:这是一款集成开发环境(IDE),用于Java、...
【Flex + FluorineFx + ASP.NET 搭建指南】 在现代Web开发中,富互联网应用程序(RIA)已经成为一种趋势,提供了丰富的用户体验。本文将详细介绍如何使用Flex作为前端开发工具,通过FluorineFx作为中间件来连接后端...
这个“Flex+.Net+Cairngorm+Fluorine的HelloWorld演示”旨在帮助开发者理解如何将这些技术整合在一起,实现跨平台的通信,并掌握Cairngorm框架的应用。 Flex 是一种基于ActionScript和MXML的开源框架,由Adobe提供...
通过FluorineFx,开发者可以轻松地在.NET环境中使用AMF(Action Message Format)协议,这是一种二进制数据格式,能够提高数据传输效率和性能。 **ASP.NET** 是微软开发的一种Web应用程序框架,用于构建动态网站、...
**ACCESS数据库** 是Microsoft开发的一款关系型数据库管理系统,适用于小型企业或个人项目,易于使用且功能相对全面。在Flex应用中,ACCESS数据库可以作为存储和管理数据的后端平台。 在"flex+fluorinefx access...
标题中的“在线拍照 c# flex+fluorineFx+webservices”揭示了这是一个基于C#技术,使用Flex前端和FluorineFx作为SOAP Web服务客户端库的在线拍照系统。让我们详细了解一下这些关键技术点。 **C#(Sharp)**: C#是...
Flex 4、ASP.NET 和 FluorineFX 是用于构建富互联网应用程序(RIA)的强大技术组合。在本教程中,我们将探讨如何使用Visual Studio 2010(VS2010)作为集成开发环境(IDE),结合FluorineFX这一开源的Adobe Flex到...
开发的时候,只需要将5个dll导入就可以了,安装程序是从官网上下载的FluorineFx.net安装程序,版号是1.0.0.15。 导入5个dll之后,就可以用c#按照官网上的教程进行rtmp协议进行通信了,不过教程上对于rtmp协议的用法...
FluorineFx.NET RTMP服务端是一款专为.NET开发者设计的开源RTMP服务器软件,它使得在.NET平台上构建实时媒体流应用变得简单易行。RTMP(Real-Time Messaging Protocol)是一种广泛应用于在线流媒体传输的技术,常...
FluorineFx是.NET平台上一个开源的Adobe Flash Remoting实现,它允许C#开发者与Flash客户端进行双向通信,使得Flex、Flash等基于ActionScript的应用能够无缝地与服务器端的.NET服务交互。在这个"FluorineFx C#搭建...
标题中的“Flex(PureMVC) asp.net FluorineFx操作数据库”表明这是一个关于使用Adobe Flex(一种基于ActionScript的前端开发框架)与后端ASP.NET通过FluorineFx进行数据交互并操作数据库的项目。以下是相关知识点的...
2. 在.NET项目中配置FluorineFx,定义要暴露给Flex的远程服务。 3. 创建Flex应用,并设置相应的Remoting配置,指定服务器地址和要调用的服务。 4. 在ActionScript代码中,通过RemoteObject或WebService组件调用.NET...
FluorineFx 是一个开源的AMF(Action Message Format)网关,它可以将Flex与ASP.NET无缝对接,提供高效的二进制数据传输,提高了应用性能。 首先,我们需要理解Flex和ASP.NET各自的角色。Flex作为客户端展示层,...
2. **安装FluorineFX**:从FluorineFX官网下载并安装最新版本,它会为ASP.NET项目提供AMF服务支持。 3. **设置FluorineFX模板**:打开VS2010,安装提供的`FluorineFXTemplate.vsix`扩展,这将为VS添加FluorineFX项目...
通过研究和理解这个FluorineFx+.NET视频聊天室源码,开发者不仅可以学习到如何利用FluorineFx搭建服务器和客户端通信,还能掌握实时音视频处理、多用户同步和网络编程等相关技能。对于想要深入.NET与Flash集成,或者...
FLEX3+.NET +FLUORINEFX 后台数据sql2005 公司做进销存的一个项目 一、FLUORINEFX经典入门技术 数据库交互 二、查询带有autocomplete功能 三、组件式开发实现切换时的过渡效果 四、ComboBox下拉树形结构 截图请登录...
在进行Flex项目的开发时,开发者可能会需要FluorineFX,这是一个开源的.NET与Adobe Flex之间的AMF(Action Message Format)通信框架。然而,默认情况下,VS2010的新建项目模板中并未包含FluorineFX。本文将详细解释...
FluorineFx是一款开源的.NET到Flash Remoting框架,它允许.NET应用程序与Adobe Flash Player进行无缝通信。本文档将详细介绍如何在Visual Studio 2010环境下配置FluorineFx,以及如何实现两者之间的交互实例。 首先...