???-???NB?? News Feed 
Tuesday, June 07, 2011  |  From ???-???NB??

WebClient或HttpRequest等Silverlight访问服务端的手段,仅提供异步方法,所以,了解Silverlight端的多线程技术,显得十分重要。


1. 跨UI线程


首先,我们要了解的是Dispatcher,Winform多线程编程时代,很多人肯定遇到过,当子线程访问UI线程的时候,MS处于规则考虑,会拒绝访问。那我们必须基于Control.Invoke、SynchronizationContext或BackgroudWorker来调用。


现在,Silverlight时代,怎么办呢?


这就不卖关子了,用 Dispatcher.BeginInvoke  就可以了。当然,要Dispatcher实现原理,还是建议,看一些大虾的文章。


2. 多个线程的同步


跨UI,多线程的问题解决了。接下来,多个线程的同步问题又出来了。可以用WaitHandle。


3. 后台线程定时器


DispatchTimer第一次亮相是在Silverlight(WPF)中作为一个后台线程计时器。与原System.Threading.Timer相比,不同之处在于DispatchTimer是真正的在后台线程中独立执行的,而定时器Timer仍然在UI线程中执行,每隔一个指定的时间接管UI线程的控制权。总体来看,DispatchTimer主要适合于调度任务的情况。在这种情况下,我们可以根据实际要求设置等待时间


4.BackgroundWorker 一直很好用


System.ComponentModel.BackgroundWorker首次出现在NET
2.0中,用于简化Windows窗体应用程序多线程交互相关的编码过程。现在,它也可用于Silverlight环境中。在后台实现中,BackgroundWorker使用了Dispatcher组件,并把所有多线程相关的复杂内容封装在一个黑盒子中,为您提供最易于使用和现成的解决方案。整体来说,BackgroundWorker非常适合从事单一的,异步的,并在后台运行的长时间的任务。






作者: 牟向阳 发表于 2011-06-07 21:48 原文链接

评论: 0 查看评论 发表评论


最新新闻:
· 谷歌为日历服务推出新功能(2011-06-07 23:12)
· 百度推网站分享按钮嵌入服务 可分享SNS站点(2011-06-07 23:06)
· 安全人士称索尼安全问题或需要数年才能解决(2011-06-07 22:49)
· 难以理解:Skype宕机,用户都责怪微软和比尔盖茨(2011-06-07 22:36)
· 苹果冷落了 iAd(2011-06-07 22:21)

编辑推荐:自己动手开发编译器(零)序言

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库

Saturday, July 31, 2010  |  From ???-???NB??

作者: Teddy's Knowledge Base 发表于 2010-08-01 00:22 原文链接 阅读: 783 评论: 11

本文的目的是以最精炼的语言,理解什么是O/R Mapping,为什么要O/R Mapping,和如何进行O/R Mapping。

什么是O/R Mapping?


广义上,ORM指的是面向对象的对象模型和关系型数据库的数据结构之间的相互转换。


狭义上,ORM可以被认为是,基于关系型数据库的数据存储,实现一个虚拟的面向对象的数据访问接口。理想情况下,基于这样一个面向对象的接口,持久化一个OO对象应该不需要要了解任何关系型数据库存储数据的实现细节。

为什么需要O/R Mapping?


广义上,因为我们需要面向对象来描述我们的业务,我们也需要关系型数据库来存储我们的数据。


有人可能会提到,我们未必要用面向对象来描述业务,或者未必用关系型数据库来存储数据。没错,但是,至少,还是有相当大部分的程序,同时需要这两者的合作。存在即合理。因为同时需要彼此,两者都客观存在,就值得讨论。


既然从广义上,存在即合理,无需讨论为什么需要ORM,很多关于ORM的讨论,其实都是针对上面提到的狭义的定义。但是即使到目前为止,真正能够完美的实现这个狭义定义的ORM的工具,其实还并不存在(很多工具如Hibernate,已经相当接近,但是,离完美还有相当距离)。


既然还不存在,那么,在讨论需不需要之前,我们恐怕要先讨论一下,是否可能,即从理论上,从数学上,面向对象的对象模型和关系型数据库的数据结构之间,到底能不能做到完美的映射?要回答这个问题,我们要解决两个难题。

O/R阻抗失衡


第一个难题,叫“O/R阻抗失衡(O/R Impedance Mismatch)”,指的是OO对象模型和关系型数据库的数据结构之间的,设计理念上的差异。OO的设计理念,是以最正确的语义来描述真实世界;而关系型数据库的设计理念,则是从数学的角度,如何更有效的存储和管理数据。由于两者设计理念的差异,导致它们尽管从数据结构上,可能很相近,但是关注点往往是不同的。


 


例如:

  • 从OO的角度,凡是语义明确,每一个对象语义上的属性,就应该定义为一个属性;从关系型数据库的角度,有可能考虑到一些属性从来不会被作为查询条件,而把多个语义上的属性,以一定的格式,存在一个数据表的字段中,也有可能因为一组语义上的属性使用的频度完全不同与另一组属性,即使他们语义上属于一个对象,也有可能将他们拆分成两个数据表来存储。
  • 从OO的角度,对象只关心自己的固有属性,不需要被唯一标识;但是,从关系型数据库的角度,一般一个数据表中的每一行数据都需要要一个唯一标识,且很可能是语义上没有意义的,如自增长的标识。
  • 从OO角度的优化,一般遵循SOLID这样的原则,以更正确的语义来组织对象;从关系型数据库角度的优化,往往为了查询性能,来修改字段的类型、长度,修改索引,甚至分表、分库。
  • ...

一个ORM工具想要通过简单的配置,完美的解决“O/R阻抗失衡”问题,在我看来几乎是不可能的。但是,一定程度上,通过灵活的配置支持绝大多数常见的映射策略,再加上提供可供用户通过自定代码来扩展的接口的话,应该还是可以相当接近完美的。

文化阻抗失衡


第二个难题,叫“文化阻抗失衡(Cultural Impedance Mismatch)”,指的是关系型数据专家和面向对象专家之间的文化差异。关于这个难题的最经典的争论是“到底应该以关系型数据库的数据结构来驱动,还是以OO的对象模型来驱动程序的开发?”。


 


关于这个争论,OO专家的主要观点是:
我的业务才是程序的核心,数据库只是为我持久化数据的需求服务的,所以设计OO对象模型的时候,我不应该考虑如何存储到关系型数据库的问题;


 


而数据库专家的主要观点是:
数据才是公司的核心财富,数据的稳定性远远强于OO对象模型的稳定性,由OO对像模型来驱动数据库架构的设计,根本保证不了性能,数据库维护的成本根本不可接受。


 


其实,争论的真正原因即在于“关系型数据专家和面向对象专家之间的文化差异”。大大牛Scott W. Ambler的文章Why Data Models Shouldn't Drive Object Models(And Vice Versa),很好的解答了这个问题。


 


归根结底,既然OO和关系型数据库都是不可缺少的部分,需要协同工作,希望做到完美的ORM,不仅仅需要好的ORM工具,更需要无论是OO专家还是数据库专家互相了解对方的技术和设计理念。对一个OO专家,一个ORM工具,可以对其所支持的常见的映射,提供直接的支持,但是,应用这些ORM工具的OO专家,必须了解关系型数据库,知道如何在不影响OO对象的语义的前提下,如何设计一个更容易映射到关系型数据库的对象模型,知道如何选择ORM工具所支持的映射方式,以及如何用自定代码扩展ORM所不能方便支持的映射方式;同样的,对一个关系型数据库的专家,也需要了解OO的语义,和可能发生的重构,从而,使得所设计的数据库结构,更容易映射到OO对象,更容易响应OO对象模型的重构。如此才是真正的和谐,真正的完美。

小结


综上所述,无论对一个OO专家还是对一个关系型数据库专家,都需要了解OO,并了解关系型数据库,了解ORM的基本原理。离开全面的知识,一个再完美的ORM工具也无法被正确使用,拥有这些知识,则能够充分利用已有的ORM工具来加速自己的工作,并且合理的或扩展现有的ORM工具,或用自定代码,实现ORM工具能力之外的ORM映射。这才是理想的ORM实践。下一章节,我们就来谈谈一下,ORM的基本原理。

如何进行O/R Mapping?

简单映射


1. Class <-> Table


一个Class一般可以映射为一个Table,一个Class的实例对应Table的一行数据。但是,一个Table中的每行数据,一般都需要有一个主键来唯一标识这行数据,而一个Class的每个实例,则不一定需要一个唯一标识。


2. Property <-> Field


一个Class的Property一般可以直接映射为Table的一个Field。但是,他们的数据类型不一定直接匹配。如果他们代表的数据类型的语义上可转换,则Field的类型,应大于等于Property的数据类型。如果他们代表的类型语义上不可转换,则需要在应用程序层面,进行自定义的转换。

继承映射


1. 单表映射整个继承体系


用一张数据库表存储整个继承体系中的所有Class的数据,数据表需要额外的标志字段来区分一行记录应该映射到继承体系中的哪一个Class,适合继承体系层次较少,总记录数相对较少,子类对父类的属性扩展也相对不那么频繁的情形。


单表映射整个继承体系的优点是读/写继承体系中的每个Class的数据,都只需操作一张表,性能较好,并且,新增继承类,或扩展Class属性都只需要增减一张表的字段就可以了,易于维护;主要缺点是,因为继承体系中所有的Class共享一张表,表中会有比较多的NULL字段值的数据,浪费了一些存储空间,同时,如果记录数过多,表就会更庞大,也会影响表的读写性能。


 


2. 一个Class映射一个具体表


所谓一个Class映射一个具体表就是每个Class对应一张数据表,并且,每个数据表冗余包含其父类的所有属性字段,并且,子类和父类共享相同的主键值。一个Class一个具体表方案适合需要较高查询性能,继承体系层次不太复杂,并且基类包含较少的属性而子类扩展较多属性,并且能够承受一定的数据库冗余的情况。


一个Class映射一个具体表方案的优点主要就是查询性能好,读操作只需操作一张表,和实体数据的对应结构清晰,数据库表迁移和维护会比较方便;主要的缺点是数据冗余较大,因为每次插入一条子类数据时,同时要插入一份子类包含的父类字段的数据到所有父类层次表中。


 


3. 一个Class映射一个扩展表


所谓一个Class映射一个扩展表是指继承体系中的每个Class对应一张数据表,但是,每个子类不冗余包含父类的所有属性,而只是包含扩展的属性和共享的主键值。一个Class映射一个扩展表方案适合继承体系非常复杂,结构易变,并希望最大程度减少数据冗余的情形。


一个Class映射一个扩展表方案的优点是结构灵活,新增子类或插入中间的继承类都很方便,冗余数据最少;但是缺点是,无论读还是写操作都会涉及到子类和所有的父类。读操作时,必须自然链接查询所有的父类对应的数据表,而插入或更新数据时,也需要写所有的父类表。


 


4. 通用的表结构映射所有的Class


这种方案其实不仅支持用一张表存储一个继承体系,它甚至可以支持,用一张表存储任意数量的不同Class。它的原理是元数据驱动。这张表的每一行,包含一个类型的标识字段,一个表示Class的属性名称的字段和一个表示Class的属性值的字段。在运行时,通过唯一标识取出描述一个Class实例的所有Property的值,再根据Property的名称来映射。


关于各种继承映射的实例分析和详细的优劣比较,请参见:Scott W. Ambler的O/R Mapping In Detail

关联映射


1. 一对一关联、一对多关联(包含一对一和一对多的自关联)


所谓一对一关联,实际上还可以分为三种情形,即0..1 - 1,1 – 1,1 – 0..1三种情形;而一对多关联则分为* - 1和1 - *。


以下三种方案中第1)种为最常用的映射方案,后面几种是在某些特殊情形下可参考的方案:


1) 最常用的方案为为需要其他对象引用的类对应的表增加一个到被引用对象对应表的外键即可,只不过,与表对应的实体类代码中,对于一对多情形下的“多”这一端,需定义成集合类型;
2) 在Hibernate称为“组件(Component)映射”,举例来说,假如Person类包含一个Address成员类型的属性,而Address由City,Street,ZipCode三个成员属性组成,假如Address除了与Person关联不被其他对象使用,则我们可以考虑只用一张数据表Person来持久化Person和Address这两张表,Person数据表包含Person类中除Address的属性和Address类中的所有属性的集合,当然,这时需要在元数据中特别指明映射关系;
3) 还有一种针对上面的方案中的Person,Address两个类的持久化方案则是将Address类型的所有属性先序列化,再存入Person表的字段Address中,这样也可以只用一张表来持久化两个类,当然,本方案中这种被序列化对象成员数据量应尽量小;
4) 还有一种方案是共享同一主键值的一对一关联。即将原本可以同属于一个表中相对使用不太频繁的字段提出来放在另一张表中,这样,这两张表的记录就可以通过一个相同的主键进行关联。


 


2. 多对多关联(包含多对多的自关联)


所谓多对多关联自然就是* - *这种情形了。一般都需要一张包含关联双方主键的关联表,在取数据时,需要链接该关联表和数据表。

英文资料

 

评论: 11 查看评论 发表评论

程序员找工作,就在博客园


最新新闻:
· 一位VC女程序员的职场奋斗经历(2010-08-01 19:55)
· 触控板真的会取代鼠标?(2010-08-01 17:10)
· 汉王下半年将推千元以内电纸书产品(2010-08-01 16:54)
· 巨鲸音乐网:谷歌并非唯一支柱(2010-08-01 16:44)
· 行业网站面临发展瓶颈:如何摆脱成长的烦恼(2010-08-01 16:27)

编辑推荐:博客园上海俱乐部八月份活动通知(2010-8-7)

网站导航:博客园首页  个人主页  新闻  闪存  小组  博问  社区  知识库

Saturday, March 06, 2010  |  From ???-???NB??

阅读: 144 评论: 1 作者: Teddy's Knowledge Base 发表于 2010-03-06 23:29 原文链接

Background

For the basic of how to create an AJAX enabled WCF service, please refer to MSDN: http://msdn.microsoft.com/en-us/library/bb924552.aspx.

For the basic of JSONP, please refer to: http://en.wikipedia.org/wiki/JSON#JSONP.

This article introduce how to make AJAX enabled WCF service support cross-domain request.

In the WCF & WF samples provided by Microsoft, there is already a “custom binding extension” implementation for JSONP support. But there is some limitation, the biggest limitation is it could not support both JSON & JSONP protocol for one AJAX enabled WCF service URL, and it requires each endpoint you want to support JSONP protocol be configured with the specific custom JSONP binding extension which increased configuration complexity & cost.

Here I introduce a more general “custom Http Module” implementation for cross-domain calling AJAX enabled WCF services.

At the beginning, firstly, please realize WCF does not support custom Http Modules by default, which means, by default, a WCF service request, even a webHttpBinding AJAX enabled WCF service request, doesn’t go through any custom Http Modules. To enable it, you need to set the aspNetCompatibilityEnabled property of serviceHostingEnvironment element to true like below:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> <system.serviceModel>
   
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
   ...
</system.serviceModel>

And to enable a WCF service support custom Http Module, you also need to mark the AspNetCompatibilityRequirementsAttribute on the service contract like below:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode
=AspNetCompatibilityRequirementsMode.Allowed)]
public class TestAjaxClientService
{
       ...
}

JSONPModule

Since with the aspNetCompatibilityEnabled property set to true, an Http WCF service request goes through custom Http Modules, it is possible to write a custom Http Module to automatically convert any JSON response to JSONP response. And actually, since it will be so general, it could not only give JSONP support to WCF, but also give JSONP support to any existing JSON response services, such as Web services and Http handler services. The JSONPModule class below is part of NIntegrate framework (BSD license), but it has no dependency. So you could use it freely and independently.

JSONPModule.cs
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;

namespace NIntegrate.Web
{
    
public class JSONPModule : IHttpModule
    {
        
private const string JSON_CONTENT_TYPE = "application/json";
        
private const string JS_CONTENT_TYPE = "text/javascript";

        
#region IHttpModule Members

        
public void Dispose()
        {
        }

        
public void Init(HttpApplication app)
        {
            app.ReleaseRequestState 
+= OnReleaseRequestState;
        }

        
#endregion

        
public void OnReleaseRequestState(object sender, EventArgs e)
        {
            HttpApplication app 
= (HttpApplication)sender;
            HttpResponse response 
= app.Response;
            
if (response.ContentType.ToLowerInvariant().Contains(JSON_CONTENT_TYPE)
                
&& !string.IsNullOrEmpty(app.Request.Params["jsoncallback"]))
            {
                response.ContentType 
= JS_CONTENT_TYPE;
                response.Filter 
= new JsonResponseFilter(response.Filter);
            }
        }
    }

    
public class JsonResponseFilter : Stream
    {
        
private readonly Stream _responseStream;
        
private long _position;

        
private bool _isContinueBuffer;

        
public JsonResponseFilter(Stream responseStream)
        {
            _responseStream 
= responseStream;
        }

        
public override bool CanRead { get { return true; } }

        
public override bool CanSeek { get { return true; } }

        
public override bool CanWrite { get { return true; } }

        
public override long Length { get { return 0; } }

        
public override long Position { get { return _position; } set { _position = value; } }

        
public override void Write(byte[] buffer, int offset, int count)
        {
            
string strBuffer = Encoding.UTF8.GetString(buffer, offset, count);
            strBuffer 
= AppendJsonpCallback(strBuffer, HttpContext.Current.Request);
            
byte[] data = Encoding.UTF8.GetBytes(strBuffer);
            _responseStream.Write(data, 
0, data.Length);
        }

        
private string AppendJsonpCallback(string strBuffer, HttpRequest request)
        {
            
string prefix = string.Empty;
            
string suffix = string.Empty;

            
if (!_isContinueBuffer)
            {
                strBuffer 
= RemovePrefixComments(strBuffer);

                
if (strBuffer.StartsWith("{"))
                    prefix 
= request.Params["jsoncallback"+ "(";
            }
            
if (strBuffer.EndsWith("}"))
            {
                suffix 
= ");";
            }
            _isContinueBuffer 
= true;
            
return prefix + strBuffer + suffix;
        }

        
private string RemovePrefixComments(string strBuffer)
        {
            var str 
= strBuffer.TrimStart();
            
while (str.StartsWith("/*"))
            {
                var pos 
= str.IndexOf("*/"2);
                
if (pos <= 0)
                    
break;
                str 
= str.Substring(pos + 2);
                str 
= str.TrimStart();
            }
            
return str;
        }

        
public override void Close()
        {
            _responseStream.Close();
        }

        
public override void Flush()
        {
            _responseStream.Flush();
        }

        
public override long Seek(long offset, SeekOrigin origin)
        {
            
return _responseStream.Seek(offset, origin);
        }

        
public override void SetLength(long length)
        {
            _responseStream.SetLength(length);
        }

        
public override int Read(byte[] buffer, int offset, int count)
        {
            
return _responseStream.Read(buffer, offset, count);
        }
    }
}

Sample

The sample in this chapter is a unit test of NIntegrate for the JSONPModule. Imagine we have an AJAX enabled WCF service – TestAjaxClientService.svc, which could be called by jQuery like below:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->       jQuery.getJSON('http://localhost:2166/TestAjaxClientService.svc/Hello'function(data) { alert('inner-domain called by jQuery through normal JSON protocol: ' + data.d); });

With the JSONPModule configured like below:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> <system.web>
   ...
   
<httpModules>
     ...
     
<add name="JSONPModule" type="NIntegrate.Web.JSONPModule, NIntegrate, Version=X.X.X.X, Culture=neutral, PublicKeyToken=e2b9e2165dbdd5e6"/>
   
</httpModules>
 
</system.web>
 ...
 
<system.webServer>
   ...
   
<modules>
     ...
     
<add name="JSONPModule" preCondition="managedHandler" type="NIntegrate.Web.JSONPModule, NIntegrate, Version=X.X.X.X, Culture=neutral, PublicKeyToken=e2b9e2165dbdd5e6"/>
   
</modules>
   ...
 
</system.webServer>

We can cross-domain call the TestAjaxClientService.svc like:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->       jQuery.getJSON('http://127.0.0.1:2166/TestAjaxClientService.svc/Hello?jsoncallback=?'function(data) { alert('cross-domain called by jQuery through JSONP protocol (no cache): ' + data.d); });
      
function jsonpCallback(data) {
           alert(
'cross-domain called by jQuery through JSONP protocol (cached): ' + data.d);
       }
       jQuery.ajaxSetup({ cache: 
true });
       jQuery.getScript(
'http://127.0.0.1:2166/TestAjaxClientService.svc/Hello?jsoncallback=jsonpCallback');
       jQuery.ajaxSetup({ cache: 
false });

评论: 1 查看评论 发表评论

找优秀程序员,就在博客园


最新新闻:
· IBM收购美国一家软件公司 本周已裁员2699名(2010-03-06 21:51)
· 寻找地球最快浏览器(2010-03-06 21:08)
· 报告称明年初苹果全球手机市场份额将超RIM(2010-03-06 19:21)
· 国际观察:IT业加速迈向“云时代”(2010-03-06 19:10)
· 在被 Google 收购后,reMail iPhone 应用宣布开源(2010-03-06 19:06)

编辑推荐:Adobe、微软论剑Flash、Silverlight与HTML5

网站导航:博客园首页  个人主页  新闻  闪存  小组  博问  社区  知识库

Saturday, February 20, 2010  |  From ???-???NB??

阅读: 106 评论: 0 作者: Teddy's Knowledge Base 发表于 2010-02-20 22:44 原文链接

E-Appointments is a Microsoft ASAP (Aspiring Software Architects Program) Case Study Implementation using the latest .NET 3.0 Technologies and proven Microsoft patterns and practices like Software Factories and Enterprise Library.

In this article, I’m going to enhance this application using NIntegrate, to demonstrate how to enhance WCF configuration management and how to make a WCF based distributed application support dynamic query easier and more maintainable in real enterprise distributed application. 

For details, please visit: http://www.cnblogs.com/teddyma/articles/1669960.html

评论: 0 查看评论 发表评论


最新新闻:
· jQuery 1.4.2 发布,性能提升(2010-02-20 23:53)
· Google Mobile App 升级,iPod Touch 也可以使用语音搜索了(2010-02-20 23:24)
· Google:你好 HTML5,再见 Gears(2010-02-20 23:23)
· 苹果员工自曝家丑 称乔布斯忽视用工问题(2010-02-20 23:20)
· 对企业最重要的十大IT公司:IBM及SAP上榜(2010-02-20 23:19)

编辑推荐:【话题】为微软平台的开发技术添上一把柴

网站导航:博客园首页  个人主页  新闻  闪存  小组  博问  社区  知识库

Friday, January 22, 2010  |  From ???-???NB??

阅读: 1 评论: 0 作者: Teddy's Knowledge Base 发表于 2010-01-23 01:17 原文链接

Project Site:

http://nintegrate.com


Download:

Download from SVN

Download from Google Code

Download from CodePlex


 

评论: 0 查看评论 发表评论


最新新闻:
· 微软Bing借新年双节力推“情感搜索”形象(2010-01-23 00:35)
· 法院再判百度MP3搜索合法 国际唱片协会败诉(2010-01-22 23:23)
· 苹果平板机最新传言一览(2010-01-22 23:08)
· 华为Android手机率先登陆香港(2010-01-22 23:01)
· WordPress基金会网站上线(2010-01-22 22:48)

编辑推荐:Google勇敢新世界

网站导航:博客园首页  个人主页  新闻  闪存  小组  博问  社区  知识库

Wednesday, January 20, 2010  |  From ???-???NB??

阅读: 188 评论: 2 作者: Teddy's Knowledge Base 发表于 2010-01-20 21:58 原文链接

NIntegrate is open source .NET enterprise SOA framework. It provides several reusable SOA components to solve specific enterprise SOA problems. Different from some other one-in-one SOA solution, NIntegrate is designed to be easily integrated with your company’s application frameworks.

Problems NIntegrate solves:


1) Decouple WCF configuration from Web.config/App.config files.

2) Dynamic query through WCF.

3) Flexible object mapping.

4) LRU dictionary & caching.

5) Single thread worker queue.

Read the article for details:


.NET Enterprise SOA – NIntegrate Practice


http://www.cnblogs.com/teddyma/articles/1651126.html




评论: 2 查看评论 发表评论


最新新闻:
· 谷歌文档联手第三方发布桌面客户端(2010-01-21 00:03)
· 郑立:一个80后神话的倒掉(2010-01-20 23:52)
· 苹果与微软商讨将谷歌移除出iPhone默认搜索(2010-01-20 22:49)
· 马云飞机上写邮件鼓励员工为梦想奋斗(2010-01-20 21:51)
· 开源JavaScript Flash Player(HTML5/SVG)(2010-01-20 21:30)

编辑推荐:开源JavaScript Flash Player

网站导航:博客园首页  个人主页  新闻  闪存  小组  博问  社区  知识库

Wednesday, January 09, 2008  |  From ???-???NB??

     摘要: 该示例使用NBearLite v1.0.1.2,基于.Net PetShop 4.0的源码修改。使用NBearLite重写了等价功能的BLL、Profile、Membership模块的数据访问部分,去除了DALFacrory、IDAL等工程(因为基于NBearLite可以透明的在多种数据库源间进行无缝切换,无需修改代码),去除了Order的基于MSMQ的异步处理部分。本示例演示了使用NBearLite作为数据访问组件进行开发的常用方法。Web工程的Web.config中默认关闭了CaceDependency,并设置了Sqlite为默认数据库。  阅读全文

Wednesday, December 19, 2007  |  From ???-???NB??

上篇中,介绍了使用NBear.Mapping进行实体对象与ADO.NET对象的互转功能,这可能是我们开发过程中最常的一种映射了。除此之外,NBear.Mapping还支持实体对象与NameValueCollection,IDictionary等弱类型的互换转,下面就让我们来看看吧。

NameValueCollection实体对象


当你希望把Request.QueryString的字段赋值到一个对象时,手工写这段代码你可能会觉得浪费时间了。现在如果NBear.Mapping可能帮你完成这个工作,难道你不会接受吗?只要简单的这样一句代码就可以完成你的工作了。




   1: UserObject outputObject = ObjectConvertor.ToObject<UserObject>(nameValue);



因为NameValueCollection的Value类型是字符串的,但是没有关系,NBear.Mapping会自动进行类型转换的。反过来,如果想把实体对象转换为NameValueCollection对象时,仍然是一样的简单:




   1: NameValueCollection outputObject = ObjectConvertor.ToObject<NameValueCollection>(user);


IDictionary与实体对象


NBear.Mapping支持将实体对象转换为实现了IDictionary的对象,比如Dictionary<string,object>,Hashtable。分别用下面没行代码就可以完成这样的转换:


Dictionary<string, object> outputObject = ObjectConvertor.ToObject<Dictionary<string, object>>(user);


Hashtable outputObject = ObjectConvertor.ToObject<Hashtable>(user);

相反的转换:


Dictionary<string, object> dic = ObjectConvertor.ToObject<Dictionary<string, object>>(user);


Hashtable hashTable = ObjectConvertor.ToObject<Hashtable>(user);

接口使用都是一样的,这里就不再嗸诉(有谁能告知一下Ao Shu是哪两个字 :( )。

性能


前面不止一次的说到,NBear.Mapping有比较优的性能。它有比较好的性能是因为它的转换使用的是动态生IL代码来进行转换的,并且生成的IL代码是有缓存的。其实相当于就是动态的手写代码。在NBear.Mapping.Test的MappingTest中,有4个测试TestPerformance1~4就是测试性能的,每一次转换分别执行100000次,随机进行的一次测试结果如下(手写 VS NBearMapping VS 反射 的性能对比,以手写代码为基准):


DataRow 转实体对象:


Test performance of converting 100000 data rows to class objects

Manually Coding vs NBearMapping vs Reflection

8906250 (1)

vs

11718750 (1.31578947368421)

vs

26093750 (2.92982456140351)


实体对象转实体对象


Test performance of converting 100000 class objects to class objects

Manually Coding vs NBearMapping vs Reflection

312500 (1)

vs

2187500 (7)

vs

15625000 (50)


DataReader 转实体对象


Test performance of converting 100000 dataReader to class objects

Manually Coding vs NBearMapping vs Reflection

7812500 (1)

vs

11406250 (1.46)

vs

29531250 (3.78)


NameValueCollection转实体对象


Test performance of converting 100000 namevaluecollections to class objects

Manually Coding vs NBearMapping vs Reflection

5625000 (1)

vs

12812500 (2.27777777777778)

vs

16875000 (3)


到些为止,NBear.Mapping的使用介绍就告一段落了。除此之外,NBear.Mapping还有一些其它功能,比如配置,自定义映射接口,扩展功能等等,这些功能只要你愿意花一些时间很容易就能够掌握了。NBear.Mapping使用其实就是这么简单,它自己本身也是很简单的,只要你愿意尝试,相信它会给你带来意想不到的效果的。


示例下载


阿不


NBear开发团队




阿不 2007-12-19 19:56 发表评论

Monday, December 17, 2007  |  From ???-???NB??

不断有朋友希望能提供一些示例,同时我也发现,单纯发一些文字性的教程。大家好像都没有看明白NBear.Mapping是干嘛用的,所以从这篇开始我会陆续以实例的方式介绍NBear.Mapping的使用,以便给大家直观的印象。这篇我们首先关注的是对象与对象间映射,在这篇文章里你将会看到。即使你的项目不需要与数据库的映射,NBear.Mapping在日常开发中也会给你带来非常大的帮助。


就如之前教程介绍的那样,有一个IUser接口,这个接口定义了用户的一些基本属性:




   1: public enum UserStatus

   2: {

   3:     Normal,

   4:     Admin

   5: }

   6: public interface IUser

   7: {

   8:     int? ID { get;set;}

   9:     string Name { get;set;}

  10:     string Address { get;set;}

  11:     int Age { get;set;}

  12:     UserStatus Status { get;set;}

  13: }



我们用一个类UserObject来实现它,这个类型除了实现IUser接口外,还有一个自定义的属性Password:




   1: public class UserObject : IUser

   2:     {

   3:         #region IUser Members

   4:         private string name;

   5:         public string Name

   6:         {

   7:             get

   8:             {

   9:                 return name;

  10:             }

  11:             set

  12:             {

  13:                 name = value;

  14:             }

  15:         }

  16:  

  17:         private int? id;

  18:         public int? ID

  19:         {

  20:             get

  21:             {

  22:                 return id;

  23:             }

  24:             set

  25:             {

  26:                 id = value;

  27:             }

  28:         }

  29:         string address;

  30:         public string Address

  31:         {

  32:             get

  33:             {

  34:                 return address;

  35:             }

  36:             set

  37:             {

  38:                 address = value;

  39:             }

  40:         }

  41:         int age;

  42:         public int Age

  43:         {

  44:             get

  45:             {

  46:                 return age;

  47:             }

  48:             set

  49:             {

  50:                 age = value;

  51:             }

  52:         }

  53:  

  54:         UserStatus status;

  55:         public UserStatus Status

  56:         {

  57:             get

  58:             {

  59:                 return status;

  60:             }

  61:             set

  62:             {

  63:                 status = value;

  64:             }

  65:         }

  66:  

  67:         #endregion

  68:  

  69:         private string password;

  70:  

  71:         public string Password

  72:         {

  73:             get { return password; }

  74:             set { password = value; }

  75:         }

  76:  

  77:         public UserObject() { }

  78:  

  79:         public UserObject(int? id, string name, string address, int age, UserStatus status, string password)

  80:         {

  81:             this.id = id;

  82:             this.name = name;

  83:             this.address = address;

  84:             this.age = age;

  85:             this.status = status;

  86:             this.password = password;

  87:         }

  88:     }



这时,我们希望将一个UserObject实例的属性拷贝到另一个UserObject实例中,那么我们可能会使用如下的代码:




   1: UserObject user = new UserObject(1, "abu", "fuzhou", 24, UserStatus.Admin,"*&3345-+¥");

   2: UserObject userObject = new UserObject();

   3: userObject.Address = user.Address;

   4: userObject.Age = user.Age;

   5: userObject.ID = user.ID;

   6: userObject.Name = user.Name;

   7: userObject.Password = user.Password;

   8: userObject.Status = user.Status;



当然,如果单纯的都是这样的属性拷贝的话,那完全可以通过实现ICloneable接口,来实现对象的浅拷贝。但是如果我们使用NBear.Mapping的话,那我们的代码将会变成这样:




   1: UserObject user = new UserObject(1, "abu", "fuzhou", 24, UserStatus.Admin,"*&3345-+¥");

   2: UserObject outputObject = ObjectConvertor.ToObject<UserObject>(user);



你会发现你的对象转换代码将会变的非常干净简单。此时,在保证系统安全的情况下,我并不希望Password字段参与拷贝工作,那么我们有几下几种做法:


1、修改代码,使用ObjectConvertor.ToObject<InputType,OutputType>(user)的形式,如下:




   1: UserObject outputObject = ObjectConvertor.ToObject<IUser,UserObject>(user);



这时,参与对象拷贝的就只有IUser接口里所定义的属性字段了。


2、不改变原有代码,在配置文件中增加这样的一段配置,就可以让过滤掉Password的拷贝:




   1: <object inputType="UserObject" outputType="UserObject">

   2:   <views>

   3:     <view name="Default">

   4:       <ignoreProperties>

   5:         <add destName="Password"></add>

   6:       </ignoreProperties>

   7:     </view>

   8:   </views>

   9: </object>

  10: <mappings>



以上是两种最简单的做法,通过NBear.Mapping,还有其它的调用方法来达到这个目的。


这篇博客比较短,目的是希望能让大家对NBear.Mapping有直观的印象。示例代码下载


阿不




三千.℡ 2007-12-17 20:08 发表评论

Saturday, November 03, 2007  |  From ???-???NB??

     摘要:  
个人求职简历表





姓   名


赵 光


性 别

...  阅读全文

JesseZhao 2007-11-03 15:26 发表评论

Friday, October 12, 2007  |  From ???-???NB??

     摘要: 名称:山东建筑大学校内购物网(SdaiBuy.com )



开发:赵光(JesseZhao)



版本:V1.0 Beta



演示地址:http://www.sdaibuy.com



功能说明:网站使用NBear3.7作为数据访问层,使用asp.net2.0+sql server2005。网站实现基本购物网站的在线订货,商品展示,分类,用户系统等模块,同时加入了web2.0的特性,可以用来作为校内购物送货的网站。现在的网站是beta版本,很多功能不完善,代码很烂,后台很简陋。现在开源出来,希望更多的人加入进来,咱们一起把这个网站变得越来越好。



开源协议:GPL协议

  阅读全文

JesseZhao 2007-10-12 22:25 发表评论

Wednesday, October 10, 2007  |  From ???-???NB??

     摘要: 本文介绍一组NBearV4中的基于Emit动态生成代码的辅助类,部分概念在本人的blog之前的文章中或多或少都有介绍,这里包含最新的更新及演示、测试。主要是两个类:CodeGenerator和DynamicMethodFactory。前者提供了一种经过封装的,简化Emit方法(包括Emit DynamicMethod,Constructor,Method,get、set Method of Property)的方案;后者基于前者,实现了一种访问指定类(可以是第三方程序集的internal类)的方法或成员变量,实例化第三方程序集中的internal类型,高性能的以非泛型语法访问泛型方法的机制(通过DynamicMethod和Delegate实现)。  阅读全文

Friday, October 05, 2007  |  From ???-???NB??

     摘要: Kevin McFarlane的C#版DesignByContract Framework实现从02年在CodeProject发布至今,几乎成为C#开发中大多数朋友使用的事实标准。本文结合对该框架的使用经验,在Kevin的原始版本的基础上,使用Strategy Pattern对其进行进一步的扩展,对最常用的检查语义进行封装简化。本文改进的源码以Public Domain协议发布,也就是说,完全没有任何限制。  阅读全文

Sunday, July 29, 2007  |  From ???-???NB??

     摘要: NBearLite是一个.NET 2.0开源(BSD协议)通用数据访问组件,支持SQL Server、Oracle、MS Access,MySQL,SQLite,PostgreSQL等多种数据库的透明切换(改变数据库类型时无需修改具体的查询代码)。NBearLite实现了一套类似LINQ的强类型数据库查询语法(支持从简单的CRUD查询到GroupBy、InnerJoin,Paging,SubQuery等常用复杂查询)。NBearLite提供的代码生成工具还可以为您自动生成所有的存储过程调用包装代码,可以让您像使用一个.NET类的方法一样访问存储过程(支持SQL Server,Oracle,MySQL,PostgreSQL数据库)。



NBearLite不是一个ORM工具,它不涉及实体类,NBearLite的所有查询返回Scalar/DataSet/IDataReader等ADO.NET原生数据类型。



推荐在使用NBearLite的同时结合使用NBearMapping进行IDataReader/DataRow数据类型和自定义.NET类(如:实体类或业务类  阅读全文

Thursday, July 26, 2007  |  From ???-???NB??

     摘要: 本测试对ADO.NET, NBearV3, NHibernateV1, NBearLite, NBearLite+NBearMapping进行了常见的读写测试。本测试同时证实,NBearLite及NBearLite+NBearMapping的ORM方案,平均性能有很大改善。  阅读全文

Wednesday, July 25, 2007  |  From ???-???NB??

     摘要: NBearMapping是NBearV4框架的组件之一,可以独立使用。可用于任意类型对象、DataRow和DataReader对象间的透明映射。建议结合NBearLite使用。

主要功能:

1、任意类型对象、DataRow和DataReader对象间的透明映射;

2、支持.NET的Nullable类型;

3、较高的性能,性能比基于Reflection的等价转换快约50%,手动代码 vs NBearMapping vs Reflection对象转换的执行时间比大约为1:2.5:3.6,可参见源码中MappingTest.TestPerformance() 测试;  阅读全文

Monday, July 23, 2007  |  From ???-???NB??

     摘要: NBearLite 更新至v1.0.0.4 beta



全面支持SqlServer,Oracle,MySql,PostgreSql数据库存储过程调用代码生成(C#/VB.NET),支持输入、输出、返回等各种参数类型。  阅读全文

Sunday, July 22, 2007  |  From ???-???NB??

     摘要: 未来的NBearV4将由ORM、SOA、WEB等几个可无缝拼接,也可独立使用或搭配第三方组件模块使用的模块组成的全新构架的开发框架。。。。  阅读全文

Friday, July 20, 2007  |  From ???-???NB??

     摘要: NBearLite是一个基于NBear的强类型查询内核的.NET 2.0开源通用数据访问组件。由NBear.org及Teddy维护。NBearLite继承了和进一步简化扩展了NBear中类似LINQ的强类型数据库查询语法(支持CRUD简单查询及GroupBy、InnerJoin,Paging等常用复杂查询),简化了命名空间、代码架构,并进一步简化了用户使用,对已有代码也没有任何侵入。NBearLite不是一个ORM工具,它不涉及实体类,NBearLite的所有查询返回Scalar/DataSet/IDataReader。

  阅读全文

Friday, May 25, 2007  |  From ???-???NB??

     摘要: 本文向读者介绍NBear中实现的DropDownListField字段绑定控件和EnumDescriptionAttribute特性。结合使用这两个组件,就可以最简单、易用和可扩展地完美解决绑定Enum到ASP.NET数据绑定控件的问题。[05/26修订]——增加支持第三方枚举描述,支持二进制与过的枚举值。  阅读全文

 ???-???NB?? News Feed 

Last edited Dec 7, 2006 at 11:16 PM by codeplexadmin, version 1

Comments

No comments yet.