FMStocks7 , 不错的一个.NET 示例程序

这个示例程序估计很多人都用过。没有用过的话可以从
http://www.microsoft.com/downloads/details.aspx?FamilyID=966C3279-2EE9-4E14-A4F7-D4807239A396&displaylang=en 下载


一个简单的股票买卖程序,数据库访问和部分业务逻辑提供了 COM+ 企业服务和 DotNet Remoting 两种方式。
具体的架构参考一下图:

fm.gif

两种分布式应用,有一下特征,呵呵。 msdn 说得

  • ASP.NET 应用程序(通过 IIS)承载远程组件以利用进程回收等功能和应用程序配置。
  • 通过 HTTP 信道使用二进制格式化程序进行远程调用。使用 HTTP 信道将能够使用 IIS 承载组件,而二进制格式化程序的性能优于 SOAP 格式化程序。
  • GAM 和 BLL 对象都是无状态的,这使得可以在 Application Center 群集中承载它们。
  • 虽然 GAM 和 BLL 对象是无状态的,但 Fitch and Mather 7.0 使用实例方法(与静态方法相对)以便能够远程处理方法调用。静态方法总是在本地执行,即与调用方在同一个 AppDomain 类中执行。有关更多信息,请参见。

当然对于第一点,你也可以host  Remoting 对象在一个 console 应用程序或者 windows 服务中。从而可以使用 TCP/Binary. 缺点TCP 需要自己去考虑安全监听。

我觉得有几点写的不错:
1。清晰的应用程序架构,由于问题比较简单。很容易整理清楚
2。 很好的coding 风格。最近在整理公司的代码规范,发现 FMStocks7 的代码注释确实不错。
比如一下是 买一个新股票的 DAO 代码
ExpandedBlockStart.gifContractedBlock.gif        /**////    <summary>
InBlock.gif        
///    Purchase shares of a specific stock.        
InBlock.gif        
/// <param name='accountID'>The accountID number</param>
InBlock.gif        
///    <param name='txID'>The transaction ID</param>
InBlock.gif        
///    <param name='ticker'>The ticker symbol to be purchased</param>
InBlock.gif        
///    <param name='shares'>Amount of shares</param>
InBlock.gif        
///    <param name='sharePrice'>The share price</param>
InBlock.gif        
///    <param name='commission'>The buy commission</param>
InBlock.gif        
///    <returns>BrokerStatus enum value</returns>
ExpandedBlockEnd.gif        
/// </summary>

None.gif
None.gif        
public BrokerStatus Buy( int accountID, int txID, string ticker, int shares, decimal sharePrice, decimal commission )
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif{
InBlock.gif            Debug.Assert( sproc 
== null );
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif            
try    dot.gif{
InBlock.gif                BrokerStatus status;
InBlock.gif            
InBlock.gif                
// Initialize order info
InBlock.gif

InBlock.gif                Order order;
InBlock.gif
InBlock.gif                order.AccountID  
= accountID;
InBlock.gif                order.TxID       
= txID;
InBlock.gif                order.Ticker     
= ticker;
InBlock.gif                order.Shares     
= shares;
InBlock.gif                order.SharePrice 
= sharePrice;
InBlock.gif                order.Commission 
= commission;
InBlock.gif
InBlock.gif                
// Debit account balance
InBlock.gif

InBlock.gif                
decimal debitAmt = ( decimal )order.Shares * order.SharePrice + order.Commission;
InBlock.gif                GAM gam 
= new GAM();
InBlock.gif
InBlock.gif                
if ( gam.DebitAccountBalance( order.AccountID, debitAmt  ) == 0 )
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    status 
= BrokerStatus.InsufficientFunds;
InBlock.gif                    ContextUtil.SetAbort();
ExpandedSubBlockEnd.gif                }

InBlock.gif                
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                      
// Create parameter array
InBlock.gif

InBlock.gif                    SqlParameter[] parameters 
=
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        
new SqlParameter( "@TxID",       SqlDbType.Int,   4 ), // 0
InBlock.gif
                        new SqlParameter( "@AccountID",  SqlDbType.Int,   4 ), // 1
InBlock.gif
                        new SqlParameter( "@Ticker",     SqlDbType.NChar, 6 ), // 2
InBlock.gif
                        new SqlParameter( "@Shares",     SqlDbType.Int,   4 ), // 3
InBlock.gif
                        new SqlParameter( "@SharePrice", SqlDbType.Money, 8 ), // 4
InBlock.gif
                        new SqlParameter( "@Commission", SqlDbType.Money, 8 ), // 5
ExpandedSubBlockEnd.gif
                    }
;
InBlock.gif
InBlock.gif                    
// Set parameter values and directions
InBlock.gif

InBlock.gif                    parameters[ 
0 ].Value = order.TxID;
InBlock.gif                    parameters[ 
1 ].Value = order.AccountID;
InBlock.gif                    parameters[ 
2 ].Value = order.Ticker;
InBlock.gif                    parameters[ 
3 ].Value = order.Shares;
InBlock.gif                    parameters[ 
4 ].Value = order.SharePrice;
InBlock.gif                    parameters[ 
5 ].Value = order.Commission;
InBlock.gif
InBlock.gif                    
// Run the stored procedure
InBlock.gif

InBlock.gif                    sproc 
= new StoredProcedure( "Broker_Buy", parameters );
InBlock.gif                    
int error = sproc.Run();
InBlock.gif                    Debug.Assert( error 
== 0 );
InBlock.gif
InBlock.gif                    status 
= BrokerStatus.Success;
InBlock.gif                    ContextUtil.SetComplete();
ExpandedSubBlockEnd.gif                }

InBlock.gif                
return status;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
catch
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                ContextUtil.SetAbort();
InBlock.gif                
throw;
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

None.gif



有几点很符合代码规范
1。合理的使用断言
2。// 注释风格
3。异常处理
4。。。。emteeth.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这个结构体对齐输出有意思

这个题目是我在群里看到大家讨论的&#xff0c;既然是讨论的了&#xff0c;那我就拿出来说说&#xff0c;因为笔试面试的时候&#xff0c;可能就会遇到这样的题目。实例代码#include "stdio.h" #include "stdint.h"struct Obj {char a; //1uint32_t b;//4u…

声压级 matlab,语音信号处理教程(二)声音的声压级和响度

本节内容我们来看下如何用Matlab和Python计算声音的声压级和响度。声压级1. 声压级定义首先来看声压级&#xff0c;这个就是指的我们平时所说的声音有多少分贝。声压定义为声波在某一点产生的逾量瞬时压强的均方根值。由于声压容易被人耳感知&#xff0c;也易于测量&#xff0c…

javascript 之作用域-06

作用域 作用域&#xff1a;是指变量可访问的范围&#xff0c;他规定了如何查找变量&#xff0c;也就是确定当前执行代码对变量的访问权限。 作用域有两种工作模式&#xff1a; 静态作用域 &#xff1a;又称为词法作用域&#xff0c;在编译阶段就可以决定变量的引用&#xff0c;…

被裁之后才明白:有一种抗风险能力,叫做会讲故事

如果你注意观察&#xff0c;会发现周围总有这么一种人&#xff1a;他说的每句话&#xff0c;单拎出来都没毛病&#xff0c;但一说出口就让人无法接受&#xff0c;很难说服你。尤其在职场里&#xff0c;这种无效沟通特别多&#xff0c;以至于产生了庞大的“沟通成本”&#xff1…

saltstack php,Saltstack快速入门简单汇总

[rootmaster~]# salt \* test.pingminion-1:Trueminion-2:Trueminion-3:Trueminion-4:TrueTrue代表正常&#xff0c;没有响应当然代表客户端没有启动或者没有认证成功之类的。指定目标主要有五种方式一&#xff1a; Global&#xff0c;即salt默认的匹配方式&#xff0c;能识别终…

课下测试03!03!03!题目截图及解析(不完全正确)第四周--信息安全系统设计基础...

课下测试03&#xff0c;也就是第三章内容&#xff0c;以下分析和解析仅供参考哦~ 注意&#xff01;最好是对着题目看一下书&#xff0c;自己思考一下题目&#xff08;毕竟我页数都给你标出来了&#xff09;&#xff0c;不是说这样你就能提高了&#xff0c;而是我正确率真不高&a…

哦!数组还能这么用,学到了!

来源&#xff1a;公众号【编程珠玑】作者&#xff1a;守望先生ID&#xff1a;shouwangxiansheng这个问题源于读者在阅读redis源码时的一个疑问。先看下面的代码&#xff0c;对于包含动态字符串成员的两个结构体Test0和Test1占用空间分别是多少呢&#xff1f;//来源&#xff1a;…

推荐开源代码2004/12/17

严正声明&#xff1a;本博客中的任何随笔、文章、图片等内容都不能私自转载&#xff0c;必须书面征得作者同意才能转载&#xff0c;并不能随意篡改&#xff0c;如要作出任何改动&#xff0c;必须书面征得作者同意方可&#xff0c;作者拥有一切权利并保留一切追究权利&#xff0…

广东,就是这么横?

昨晚的稿 今天发一下 应该有好久好久没有写篮球相关的文章了&#xff0c;因为之前写了被骂了&#xff0c;不过&#xff0c;今天不一样&#xff0c;毕竟方超巨打得这么好&#xff0c;不吹一下&#xff0c;总感觉今天不完整&#xff0c;骂就骂了吧&#xff0c;反正也不差这一次了…

在ASP.NET中利JavaScript实现控件的聚焦

在Windows应用程序中很容易控制控件的聚焦&#xff0c;但是在ASP.NET中并没有提供这样的功能&#xff0c;但是我们同样可以实现这样的功能&#xff0c;这篇文章就讲述了通过JaveScript实现在页面上某一特定控件获得焦点的功能。 下面是用到的JavaScript代码。 <script langu…

电厂各类设备原理动图,绝对让你看花眼!

▲ 火力发电流程原理▲ 核能发电流程原理▲ 水力发电流程原理▲ 光热发电原理▲ 垃圾发电原理▲ 蒸汽吸收式制冷原理▲ 尿素热解脱硝流程原理▲ 湿法脱硫工艺原理▲ 钢球磨煤机内煤的破碎原理▲ 碎煤机工作原理▲ 螺旋输送机&#xff08;绞龙&#xff09;原理▲ 多管电除尘器▲…

也谈MMU管理机制

1&#xff0c;结构&#xff1a; MMU存储器系统的结构允许对存储器系统的精细控制。大部分的控制细节由存在存储器中的转换表提供。这些表的入口定义了从1KB 到1MB 的各种存储器区域的属性。这些属性包括&#xff1a; 虚拟地址到物理地址映射 ARM 处理器产生的地址叫虚拟…

__ATTRIBUTE__ 你知多少?

_ATTRIBUTE__ 你知多少&#xff1f; 1 #include "stdio.h"2 3 /* 地址参考基准 */4 5 char r1;6 short r2;int refer;7 8 struct p9 { 10 int a; 11 12 char b; 13 14 short c; 15 16 }__attribute__((aligned(4))) pp; 17 /* 4字节对齐&#xff0c;a…

跟几位大佬共进晚餐

这是一篇几个程序员大佬聚会的聚后感文章这次聚会比较唐突&#xff0c;连总从广州专门开车来深圳看望我们&#xff0c;我们约在了某个地铁站的八合里牛肉火锅店&#xff0c;这是一个周五的下午&#xff0c;理论上是非常简单的一个周五&#xff0c;但是因为这些男人女人的存在&a…

vue.js框架搭建

安装脚手架 前提条件&#xff1a;已安装node&#xff08;4.0版本以上&#xff09;&#xff0c;npm a、全局安装 vue-cli npm install -g vue-cli 安装成功后可以通过命令行查看版本号&#xff0c;如图 b、初始化项目 新建一个文件夹命名为01vue&#xff0c;准备在此文件夹下存放…

oracle数据库imp导入,imp 导入 没有数据库

IMP-00009: 导出文件异常结束今天准备从生产库向测试库进行数据导入&#xff0c;结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误&#xff0c;google一下&#xff0c;发现可能有如下原因导致imp的数据太大&#xff0c;没有写buffer和commit两个数据库字符集不同从…

MIK C语言面试两题

这是一个读者朋友在知识星球上提到的两个笔试题&#xff0c;第一个题目比较简单&#xff0c;关键在第二个题目「编程题」&#xff0c;我文章中写的解题思路应该不是最好的&#xff0c;希望大神读者们给出更好的答案&#xff0c;让这个充满乐趣的程序世界再增添一些乐趣吧&#…

看看大疆的C语言面试题

惯例&#xff0c;这笔试题也是一个读者朋友发给我的&#xff0c;简单看了下&#xff0c;并不觉得这是一个非常困难的题目&#xff0c;最近是校招准备的时候&#xff0c;很多人给我说发面试题对大家有帮助。这个题目面试官强调了这个跑在64位系统下。代码如下:#define mal(x,y) …

RocketMQ实战(一)

阿里巴巴有2大核心的分布式技术&#xff0c;一个是OceanBase&#xff0c;另一个就是RocketMQ。在实际项目中已经领教过RocketMQ的强大&#xff0c;本人计划写一个RocketMQ实战系列&#xff0c;将涵盖RocketMQ的简介&#xff0c;环境搭建&#xff0c;初步使用、API详解、架构分析…

C面试总结文档

最近很多人有参加面试&#xff0c;面试就避免不了笔试&#xff0c;嵌入式面试的话&#xff0c;避免不了C语言&#xff0c;所以给大家准备了两份pdf C语言面试总结的文档。在本公众号回复 「C面试」获取pdf下载链接推荐阅读&#xff1a;专辑|Linux文章汇总专辑|程序人生专辑|C语…