生命之价
---程序员
posts - 21,  comments - 6,  trackbacks - 0
  • 如果你是一位软件架构师,您将如何去搭建一个符合n-tie的架构?并请描述一下您搭建的每一层的作用。(注意:请您考虑项目中有WebService的情况)
    答案:
    主要根据实际情况来决定搭建的层数以及各层的规格。
    一般情况下,可如下搭:

         数据层:主要提供数据服务,该层继承实体的接口并定制自己的数据提取和存储。并根据数据库类型如sqlserver、oracle等来建立此层服务。执行逻辑我个人偏好采用存贮过程。

        业务层:由于定制的实体的属性和操作实体的方法已由数据层获得和执行,故业务逻辑组件对此实体进行组合以满足上层对业务逻辑组件的调用,webservice也是建在此层,以用于提供数据服务和逻辑执行。

        表示层:一般定制不同的容器控件,以用于加载从业务层不同类型的数据便于呈现。当然也要此层的风格以及各种显示设置,webservice显示页面建在层,通过加载对指定目录的webservice提供的方法用于呈现。

  • WCF技术有什么优势
    【考点】
    对WCF技术的了解,WCF技术的基本内容。
    【出现频率】
    ★★☆☆☆
    【解答】
    常用的分布式技术有COM+、.NET远程技术(Remoting)、Web Service和微软消息队列服务,WCF技术将这些分布式技术整合为一个高效的API。常用的那些分布式技术只能解决项目开发中某个方面的问题,并且不同技术对平台要求不同。在项目中有时要使用到多种技术从而导致这些技术所提供的服务有重叠之处,并且整个项目的维护复杂性大大增加。WCF技术提供了一个完整统一的方案解决这些问题,它提供了一个用于访问各种分布式技术的通用API,并且增加了很多必要的服务。
    【分析】
    本题主要考查面试者对.NET Framework新版本中WCF技术的基本认知。公司招聘.NET程序员不一定非要熟练掌握WCF这样的新技术,但是一定会要求所招聘的人才具备对新技术的了解,对新技术探索的好奇心。本题即为这样的目的而设,难度不大,只要面试者对新技术有一定程度的了解,经过短时间的培训即可掌握,其考查重点在于面试者的知识广度。

 

  • .NET Remoting和Web Service有什么异同
    【考点】
    .NET Remoting技术相对于Web Service的优势和劣势。
    【出现频率】
    ★★★☆☆
    【解答】
    1.  Remoting技术可以灵活地定义其所基于的协议,比如HTTP协议和TCP协议。在实际开发中,Remoting一般使用TCP协议,这样可保证在保持状态的情况下,获取比Web Service更好的性能,而Web Service默认情况下是没有状态的。
    2.  Remoting技术不是行业标准,而Web Service是行业标准,并可能成为下一代网络数据交换的核心组成部分。
    3. Remoting技术可用.NET的Windows窗体程序或Windows服务进行启动,也可以使用IIS部署,而Web Service则必须通过IIS之类的服务启动。
    4.  在VS 2008等.NET开发环境中,专门对Web Service的调用进行了封装,可以直接通过添加Web引用或服务引用调用Web Service,节约大量代码。而Remoting需要编写更多代码,开发效率较低。
    5. .NET Remoting的通信要求双方运行相同的平台框架,如.NET Remoting需要客户端和服务器端安装.NET Framework。而WebService是平台独立的,可跨语言(支持XML的语言)互动。
    【分析】
    本题考查面试者的数据库相关的ASP.NET开发经验,.NET Remoting与WebService有所不同,Remoting技术支持HTTP以及TCP信道,而且不仅能传输XML格式的SOAP包,也可以传输传统意义上的二进制流,这使得Remoting效率更高也更加灵活。Remoting不依赖于IIS,服务器端和客户端可以非常灵活地部署。从某些方面上来讲WebService其实上是.NET Remoting的一种特例。

 

 

posted @ 2011-03-09 22:05 Freeman Shen 阅读(118) 评论(0) 编辑

    发现很多朋友对于C#中的Abstract和Virtual函数区分得不是很清楚,下面我通过两段代码让大家看看这两者之间到底有什么区别~~

开发环境: VS.net 2005

使用方法: 用以下代码覆盖program.cs中的代码,然后run即可

第一段代码: Abstract的用法

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

namespace ConsoleApplication3
{
    public abstract class Book
    {
        //抽象方法,不含主体,抽象方法所在类必须为抽象类,派生类必须实现该方法
        public abstract void Introduce();
    }

    public interface iBook
    {
    }

    public class JavaBook : Book
    {
        //实现抽象方法,必须实现,必须添加override关键字
        public override void Introduce()
        {
            Console.WriteLine("I'm Java");
        }

//            // Compile Error
//            public void Introduce()
//            {
//                Console.WriteLine("I'm Java");
//            }
    }


    public class test
    {
        public test()
        {
            JavaBook javaBook = new JavaBook();
            javaBook.Introduce();      //将调用JavaBook中Introduce()
            Book book = new JavaBook();
            book.Introduce();      //将调用JavaBook中Introduce()
        }
        public static void Main()
        {
            test t = new test();
        }
    }
}

第二段代码: Virtual的用法以及override的用法

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

namespace ConsoleApplication2
{
    public abstract class Book
    {
        public virtual void Introduce()
        {
            Console.WriteLine("I'm book");
        }

        public virtual void SayHi()
        {
            Console.WriteLine("Hi, I'm book");
        }
    }


    public class JavaBook : Book
    {
        public override void Introduce()
        {
            Console.WriteLine("I'm Java");
        }

        //注意,此方法没有override父类的方法
        public void SayHi()
        {
            Console.WriteLine("Hi, I'm Java");
        }
    }


    public class test
    {
        public test()
        {
            JavaBook javaBook = new JavaBook();
            Book book = new JavaBook();
            javaBook.Introduce();       //将调用JavaBook中Introduce()
            book.Introduce();       //将调用JavaBook中Introduce()

            javaBook.SayHi();      //将调用JavaBook中SayHi()
            book.SayHi();           //将调用Book中SayHi()
        }

        public static void Main()
        {
            test t = new test();
        }
    }
}

 

第三段代码: new的用法

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

namespace ConsoleApplication4
{
    public abstract class Book
    {
        public void Introduce()
        {
            Console.WriteLine("I'm book");
        }

        public void SayHi()
        {
            Console.WriteLine("Hi, I'm book");
        }
    }


    public class JavaBook : Book
    {
        // 没有加new,但C#默认行为会加上new
        public void Introduce()
        {
            Console.WriteLine("I'm Java");
        }

        // 显式加上new,跟不加new实际效果一样,只是加new之后会消除compile warning
        public new void SayHi()
        {
            Console.WriteLine("Hi, I'm Java");
        }
    }


    public class test
    {
        public test()
        {
            JavaBook javaBook = new JavaBook();
            Book book = new JavaBook();

            javaBook.Introduce();       //将调用JavaBook中Introduce()
            javaBook.SayHi();           //将调用JavaBook中SayHi()
           
            book.Introduce();       //将调用Book中Introduce()
            book.SayHi();           //将调用Book中SayHi()
        }
        public static void Main()
        {
            test t = new test();
        }
    }
}

posted @ 2009-08-19 18:01 Freeman Shen 阅读(119) 评论(0) 编辑
摘要: Check Constraints限制本表的行数阅读全文
posted @ 2009-03-27 11:51 Freeman Shen 阅读(126) 评论(0) 编辑

主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。

必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。

主键:

  关系数据库依赖于主键---它是数据库物理模式的基石。主键在物理层面上只有两个用途:

        1. 惟一地标识一行。

        2. 作为一个可以被外键有效引用的对象。

  基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则:

        1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。

        2. 主键应该是单列的,以便提高连接和筛选操作的效率。

       注:使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反对这种做法,理由是:复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。

        3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。

       注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。

        4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。

        5. 主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。

http://www.cnblogs.com/tianyamoon/archive/2008/04/02/1134394.html

posted @ 2009-03-10 13:33 Freeman Shen 阅读(102) 评论(0) 编辑

http://msdn.microsoft.com/zh-cn/magazine/cc163917(en-us).aspx

总结:

1、userInput 加校验,以防止输入可能造成attacks的字符

2、杜绝使用dynamic SQL ,可以采用存储过程和sql参数的方式来操作DB

3、不要使用Admin Account,设定少privilege Account来连接字符串

4、hash or encrypt 进行加密secret信息

5、error message不要泄密

posted @ 2009-02-23 14:16 Freeman Shen 阅读(25) 评论(0) 编辑
摘要: 命名空间: System.Collections.Generic程序集: System(在 System.dll 中)语法 [SerializableAttribute][ComVisibleAttribute(false)]public class Queue<T> : IEnumerable<T>, ICollection, IEnumerable类型参数T指定队列中...阅读全文
posted @ 2008-11-21 13:53 Freeman Shen 阅读(184) 评论(0) 编辑
摘要: 什么是信号量(Semaphore) 如果你已经了解信号量(Semaphore)的概念了,请跳过这一段。 信号量(Semaphore)是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。 我们来看看一个停车场是怎样运作的。为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这是如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩...阅读全文
posted @ 2008-11-21 13:41 Freeman Shen 阅读(464) 评论(0) 编辑
摘要: kehua says:呵呵 那你对股票持续下跌有啥看法freeman says:首先看持续下跌的原因freeman says:从国际看,国际金融环境都出在金融紊乱时期freeman says:现在受华尔街金融风暴的影响freeman says:二,从国内环境看,freeman says:国内的金融环境,以及经济增长变慢freeman says:为什么会变慢呢?freeman says:因为中国长期...阅读全文
posted @ 2008-10-24 14:56 Freeman Shen 阅读(136) 评论(0) 编辑
posted @ 2008-06-05 10:06 Freeman Shen 阅读(1758) 评论(0) 编辑
posted @ 2008-05-12 14:33 Freeman Shen 阅读(525) 评论(0) 编辑
昵称:Freeman Shen
园龄:4年10个月
粉丝:1
关注:0

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

搜索

 
 

常用链接

我的标签

随笔分类

随笔档案

相册

Study Englist

高人

计算机Link

最新评论

阅读排行榜

评论排行榜

推荐排行榜