RSS 2.0 Feed
译文
摘要:【原文地址】 http://codingdojo.org/cgi-bin/wiki.pl?KataPotter 【题目描述】 从前有一套5册的系列书,是关于一个名叫“Harry”的英国英雄的(起码在该问题出现时还只有5本,但之后又出了无数本)。全世界的儿童都认为他非常了不起,自然,出版商也这么认为。作为一种对全人类的无比慷慨的姿态,(以及为了提高销量),出版商制定了下述标价模型,来充分利用Harry的魔力: 5册书的任何1本的价格为8欧元。但,假如你从该系列购买2本不同的书的话,这2本书你可以得到5%的折扣。如果你购买3本不同的书,你可以得到10%的折扣。如果你购买4本不同的书,你可以得到20%的折扣。如果你购买整个系列,你可以得到25%的折扣。 注意,如果你购买4本书,其中3本书是不同的,那么对那3本书,你可以得到10%的折扣,但第4本的价格仍然是原价-8欧元。 Potter狂热席卷全国,各地少年儿童的父母装着满车的Potter书在柜台外排起了长队。。。你的任务是写段代码,计算每个购物车的金额,尽可能给与最大折扣。 譬如,这个购物车里的图书算多少钱? 第一册书有2本第二册书有2本第三册书有2本第四册书有1本第五册书有1本 (答案是 51.20 欧元)。 【提示】 一开始你也许会发现这个题目很容易,你可以从0本书,1本书,2本同样的书,2本不同的书。。。。等等购物车例子开始,迈小步子前进,逐步引进复杂性。 然后,当你坐下来,计算上面的购物车例子该算多少钱时,你会发现其中的曲折。金额不是5*8*0.75+3*8*0.90,实际上是4*8*0.8+4*8*0.8。这个题目的验收测试并没有错误,诀窍是你该如何编程来决定2份4册的书比1份3册的书和1份5册的书便宜。 你也许需要引进一些优化算法,但不用太费劲,按部就班地解决问题,相信自己在新的需求来临时,能进行概括,改进方案。 【推荐的测试例子】(是以Ruby语言写的,但应该很容易转换成C#代码的):def testBasics assert_equal(0, price([])) assert_equal(8, price([0])) assert_equal(8, price([1])) assert_equal(8, price([2])) assert_equal(8, price([3])) assert_equal(8, price([4])) assert_equal(8 * 2, price([0, 0])) assert_equal(8 * 3, price([1, 1, 1])) end def testSimpleDiscounts assert_equal(8 * 2 * 0.95, price([0, 1])) assert_equal(8 * 3 * 0.9, price([0, 2, 4])) assert_equal(8 * 4 * 0.8, price([0, 1, 2, 4])) assert_equal(8 * 5 * 0.75, price([0, 1, 2, 3, 4])) end def testSeveralDiscounts assert_equal(8 + (8 * 2 * 0.95), price([0, 0, 1])) assert_equal(2 * (8 * 2 * 0.95), price([0, 0, 1, 1])) ......[阅读全文]

posted @ | Feedback (2) |

摘要:在ASP.NET 2.0中操作数据::创建一个数据访问层 原文 | 下载本教程中的编码例子 | 下载本教程的英文PDF版 导言 作为web开发人员,我们的生活围绕着数据操作。我们建立数据库来存储数据,写编码来访问和修改数据,设计网页来采集和汇总数据。本文是研究在ASP.NET 2.0中实现这些常见的数据访问模式之技术的长篇系列教程的第一篇。我们将从创建一个软件框架开始,这个框架的组成部分包括一个使用强类型的DataSet的数据访问层(DAL),一个实施用户定义的业务规则的业务逻辑层(BLL),以及一个由共享页面布局的ASP.NET网页组成的表现层。在打下这个后端的基础工作之后,我们将开始转向报表,示范如何显示,汇总,采集,和验证web 应用的数据。这些教程旨在简明扼要,使用了许多屏幕截图,提供了按步就 班(step-by-step)的指导,带你经历这个开发过程。每个教程都有C# 版和VB版,并且附有涉及的完整的编码的下载。(这第一个教程比较长,但以后其他的教程将以更容易消化的篇幅推出。) 在这些教程中,我们将使用置于App_Data 目录内的微 软SQL Server 2005 Express版的Northwind数据库。除了数据库文件外,App_Data目录还带有用于创建数据库的SQL脚本,万一你想使用别的数据库版本的话。如果你愿意的话,你也可以直接从微软下载这些脚本。如果你使用别的SQL Server版本的Northwind数据库的话,你需要更新Web.config文件中的NORTHWNDConnectionString设置。本教程中的web应用是个基于文件系统的网站项目,是使用Visual Studio 2005 专业版建立起来的。但是,所有的教程都可以在Visual Studio 2005的免费版本Visual Web Developer中运行。 在这个教程里,我们将从头开始,先创建一个数据访问层(DAL),然后在第二个教程里创建一个业务逻辑层(BLL),在第三个教程里设计页面布局和导航。以后的教程将建立在这三个教程的基础之上。在第一个教程里,我们要讨论的内容多多,所以,请打开Visual Studio,让我们动起手来! 第一步:创建一个Web项目,配置数据库连接 在我们开始创建数据访问层(DAL)之前,我们首先需要创建一个网站,以及建立一个数据库。我们从创建一个基于文件系统的ASP.NET 网站开始。次序如下,打开文件(File)菜单,选择新的网站 (New Web Site),系统会显示一个新网站对话框,选择ASP.NET网站模板(Web Site template),设置定 位(Location)列表的选项为文件系统( File System),然后选这一个放置这个网站的文件夹,然后选择编程语 言为C#。 图 1: 创建一个基于文件系统的网站 Visual Studio会为你生成一个新的网站,同时生成一个名为Default.aspx的网页,和一 个App_Data文件夹。 网站生成之后,下一步是在Visual Studio的服务器资源管理器(Server Explorer)里为你的数据库添加一个引 用(reference)。把一个数据库添加到服务器资源管理器之后,你就能在Visual Studio环境里添加数据表,存 储过程,视图等等。你也能查看数据库里的数据,手工或用查询生成器(Query Builder)的图形界面建立你自己的查询语句。此外,当我们为DAL创建强类型的DataSet时,我们需要把Visual Studio指向作为DataSet数据源的目标数据库。虽然我们可以在适当时候提供所涉及的数据库连接信息,但假如我们预 先在服务器资源管理器里注册这些数据库的话,Visual Studio会自动把这些数据库填充到一个下拉列表中去 。 把Northwind数据库添加到服务器资源管理器中去的步骤取决于你想使用放置在App_Data文件夹 里的SQL Server 2005 Express 版本数据库,还是你想使用已经建立好了的SQL Server 2000或2005 数据库服 务器。 使用置于App_Data文件夹中的数据库 如果你没有可连接的SQL Server 2000 或2005服务器,或者你就是想避免给数据库服务器添加数据库,你可以使用SQL Server 2005 Express版的Northwind数据库,该数据库位于下载源码中的App_Data文件夹里(NORTHWND.MDF)。 置于App_Data文件夹里的数据库会被自动添加到服务器资源管理器中。假设你已经在你的机器上安装了SQL Server 2005 Express版本,那么你应该在服务器资源管理器中看到一个名为NORTHWND.MDF的节点,你可以将这个节点扩展开来,浏览其中的数据表,视图,存储过程等等 (参考图2)。 App_Data文件夹还可以放置微软的Access.mdb数据库文件,跟SQL Server 的数 据库文件类似,这些Access文件会被自动地添加到服务器资源管理器中。如果你不想用任何SQL Server数据库,那么你总归可以下载微软Access版本的Northwind 数据库文件,然后将其放置于App_Data文件夹中。但记住,Access数据库没有SQL Server那么多功能,而且它并不是设计来在网站情形下使用的。此外,在后面几个教程里将用到Access数据库不支持的数据库层次的功能。 连接到微软SQL Server 2000或2005数据库服务器中的数据库 或者,你也可以连接到安装在数据库服务器上的Northwind数据库。假如数据库服务器上尚未安装Northwind数据库的话,你首先必须运行本教程下载文件中的安装脚本来把数据库添加到数据库服务器上去,或者你也可以从微软网站上直接下载SQL Server 2000的Northwind数据库以及安装脚本。 安装数据库完毕之后,去Visual Studio中的服务器资源管理器,在数据连接(Data Connections)节点上按右鼠标,选择“添加连接(Add Connection)”。如果你看不到服务器资源管理器,去菜单“查看(View)”点击 “服务器资源管理器”,或者按组合键Ctrl+Alt+S来打开服务器资源管理器。这会打开添加连接的对话框,在这上面,你可以设置需要连接的服务器,认证信息,以及数据库名字。在你成功配置数据库连接信息,按OK按钮之后,数据库就会被添加成数据连接节点之下的一个节点。然后,你就可以扩展数据库节点来浏览数据表,视图,存储过程等等。 图 2: 添加一个到你的数据库服务器上的Northwind数据库的连接 第二步:创建一个数据访问层 与数据打交道时,一种做法是把跟数据相关的逻辑直接放在表现层中(在一个web应用里,ASP.NET网页构成了表现层)。其形式一般是在ASP.NET 网页的编码部分写ADO.NET 编码或者在标识符部 分使用SqlDataSource控件。在这两种形式里,这种做法都把数据访问逻辑与表现层紧密耦合起来了。但推荐 的做法是,把数据访问逻辑从表现层分离开来。这个分开的层被称作是数据访问层,简写为DAL,一般是通过 一个单独的类库项目来实现的。这种分层框架的好处在很多文献里都有阐述(详见本教程最后的“附加读物”里 的资源),在本系列中我们将采用这种方法。 跟底层数据源相关的所有编码,譬如建立到数据库的连接,发出SELECT,INSERT ,UPDATE,和DELETE命令等的编码,都应该放置在DAL中。表现层不应该包含对 这些数据访问编码的任何引用,而应该调用DAL中的编码来作所有的数据访问请求。数据访问层包含访问底层数据库数据的方法。譬如,Northwind数据库......[阅读全文]

posted @ | Feedback (116) |

摘要:原文地址: What Is Role Based Security 基于角色的安全是一种用户级别的安全形式,在这种形式里,服务器注重的不是单独用户的身份,而是她所处于的逻辑角色。这可以由多种方法来实现。一个方法就是在服务器上安置一些代表角色的本地逻辑组别。然后服务器应用程序可以查询这些组别的SID(WhatIsAGroup),然后根据这些组别的存在与否来做出安全方面的决定。譬如,假如某个服务器的特殊访问权限只限于 Admins角色组的成员,可以生成一个叫做APP_NAME_Admins 的本地组别来代表那角色。 这个简单的基于角色的架构的好处是,它简化了开发人员和管理员两者的事务,因为两者都依赖充分理解和可靠的操作系统机制来实现安全。管理员用Windows内置的工具把用户(或者域的组别)添加到应用程序的角色(本身就是服务器上的当地组别)里去,服务器程序则依赖Windows操作系统通过Kerberos (WhatIsKerberos)来提供认证和授权信息。服务器程序可以从自客户端获取的安全令牌(WhatIsAToken)里读取这些细节。最简单的方法就是调用代表用户的WindowsPrincipal对象的IsInRole方法。这个principal(主体)对象可以通过多种方式获取,但象 ASP.NET这样的大多数很完善的服务器端基础环境会通过Thread.CurrentPrincipal (WhatIsThreadDotCurrentPrincipal)属性来提供该对象。但在简单的桌面应用程序里,不必为Thread.CurrentPrincipal费心,因为该对象只是在服务器应用程序里才有使用的需要。在桌面应用程序里,你只要一句编码就能获取运行你的应用程序的当前用户的WindowsPrincipal 对象 IPrincipal WhoIsRunningThisApplication() { return new WindowsPrincipal(WindowsIdentity.GetCurrent()); } 一些象 COM+(HowToImplementRoleBasedSecurityForAManagedCOMApp) 和授权管理器(WhatIsAuthorizationManager),甚至SQL Server这样的系统,提供它们自己的基于角色的基础设施,所以没必要另建安全组别。但概念是一样的。对基于角色系统需要注意的是一件事情是,它的粒度比不上基于 ACL系统(WhatIsACLBasedSecurity)的粒度。基于角色的系统的安全以用户为中心,而不是以用户想要访问的个别对象为中心。但这也意味着,基于角色的系统的安全没那么复杂(只要比较一下本书里涉及基于ACL的安全的条目个数与基于角色的安全的条目个数就知道了)。当然,有关安全系统里简洁性另有说法,让我们来听听Ferguson and Schneier (2003)是怎么说的: 没有哪个复杂系统是安全的。复杂度是安全的最大的敌人,因为复杂度几乎总是以功能或选项的方式出现的...[阅读全文]

posted @ | Feedback (0) |