RSS 2.0 Feed
2004-05 Entries
摘要:IContextAttribute 是判断某一个System.Runtime.Remoting.Contexts.Context是否符合它的要求.如果任何一个IContextAttribute或其他对象认为不符合,则创建一个新的Context,然后进入这个Context,再调用所有的IContextAttribute.GetPropertiesForNewContext . 对于 事务/同步 等东西的NOTSUPPORT/SUPPORT/REQUIRED/REQUIRE_NEW就是在这个基础上实现的. 就如 IContextAttribute 一样,DotNet为消息的分发提供了扩展方法:DotNet寻找一个类型上的属性,如果有符合IContributeServerContextSink/IContributeClientContextSink/IContributeObjectSink的,则把它用于扩展. 通常一个TransparentProxy的方法被调用,DotNet会调用RealProxy.PrivateInvoke为这个方法调用的堆栈影射为一个IMethodCallMessage,并且由RealProxy.Invoke进行具体对IMethodCallMessage的执行.对于常规的RemotingProxy,它则是根据这个TrapsparentProxy的 ChannelSink 进行封送(如果是跨Context的,则先用CrossContextChannelSink送到目标的Context , ContextBoundObject就是这样形成Context边界的) . 只要在一个类型上定义这个IContributeServerContextSink/IContributeClientContextSink/IContributeObjectSink的Attribute,则就能在封送过程中插入自定义的一步. ContextBoundModel 本来是继承ProxyAttribute来创建目的对象的. 但目前发现和ServicedComponent/Context 并不兼容.主要是我在原Context上直接创建对象了.并且把其他的IXXXAttribute的功能忽略掉!一直都没有出现问题的原因是我没有对这些东西并进来进行测试。所以这几天可能会改动为IContributeServerContextSink/IContributeClientContextSink/IContributeObjectSink的实现. MSDN 上刚好有一篇同时讲这两个的文章:Decouple Components by Injecting Custom Services into Your Object's Interception Chain(里面提到的例子 LogBook 就是一个 AOP 思想的应用.)...[阅读全文]

posted @ | Feedback (5) | Filed Under [ DotNet ]

摘要:http://blogs.msdn.com/timbrookins/ 介绍的链接: http://blogs.msdn.com/kevin_ransom/archive/2004/02/27/81391.aspx 期待!...[阅读全文]

posted @ | Feedback (1) | Filed Under [ DotNet ]

摘要:想不到2年前MSDN上就有用ContextBoundObject来实现AOP的文章.Aspect-Oriented Programming Enables Better Code Encapsulation and Reuse 但是为什么现在网络上基于ContextBoundObject的AOP.NET框架不多呢? 也许是很多致力于AOP的人都希望用机器码的角度去做这件事.目的当然是性能. 不过按我的理解,ServicedComponent就是实实在在的ContextBoundObject实现的AOP的样板. 详细可以看 ServicedComponentProxy 的实现.ConextBoundModel...[阅读全文]

posted @ | Feedback (21) | Filed Under [ DotNet ]

摘要:这次用NUnit做了三个测试ContextBoundModel的类.测试了基本的AspectObject的行为.IAspectServerMessageHandler,IMessageHandler,IMessageHandlerAttribute的一些行为.下载:http://www.lostinet.com/files/ 找到 lcbm 的最后的版本.另外,如果你有兴趣,希望你能和我一起讨论IMessageHandlerBase的优先级别的问题.这个是一个优先级别的enum.在v1.0出来前不给它们具体的值.TraceMessageHandling的级别最高.代表它在最外层调用.FinalImplementation则放在最内层,用于替换默认实现过程public enum MessageHandlerPriority {  //,AspectObjectProxy , Setup MessageContext  TraceMessageHandling   ,  CheckArguments   ,  SetupComPlusContext   ,  SetupEnvironment   ,  CheckPermission   ,  SetupTransaction   ,  Default   ,  CheckReturnValues   ,  PrepareImplementation   ,  AspectImplementation   ,  ///   /// You can replace the default implementation here!  ///   FinalImplementation }对于一个AOP的拦截,目前我能想到的就是这些过程.如果你有些想法,请给我意见.谢谢!!...[阅读全文]

posted @ | Feedback (4) | Filed Under [ DotNet ]

摘要:通常自己做一套Framework的时候,都会自己弄套 Exception 类。 例如:public class MyFrameworkException : Exception 不过,这个类最好是[Serializable],并且提供满足ISerializable协议的构造方法: [Serializable] public class MyFrameworkException : Exception{    public MyFrameworkException(string msg):base(msg){}    public MyFrameworkException(SerializationInfo info,StreamingContext context):base(info,context){}} 当然,如果有成员数据,最好  public override void GetObjectData(SerializationInfo info, StreamingContext context){    base.GetObjectData (info, context);    //添加自己的数据。。}...[阅读全文]

posted @ | Feedback (4) | Filed Under [ DotNet ]

摘要:不要以为到了DotNet时代就不需要引用计数了。 COM时代的引用计数是兼并资源与内存回收于一体的方案。可惜非常难维护。并且解决不了引用链的问题。 DotNet时代的垃圾回收,只是内存的回收方案。它在回收对象时通过Finalize来通知对象,该收集资源了。可惜这个可能导致回收资源的延迟。。 就好象你Open一个SqlConnection,不Close它,而直接放弃它的引用。那么你就只好等GC收拾它了。可惜一个数据库连接就在回收前白白地浪费掉了。 DotNet提出一个方案,叫 IDisposable 。实现这个接口的类,告诉使用它的人,当你不要我的时候,麻烦先Dispose我。 可惜问题仍然还是在的。你不要这个类,不代表别人不要啊。你把它Dispose掉,那么别人怎么办? 通常,你要Dispose一个对象,一个很充分的理由是,到最后只有你使用这个对象。这需要编程人员很清楚某个对象是不是只有自己再使用。 不过电脑的发展很快啊。各种各样的模式在不断地出。到了某个时候,一个对象哪里来的,到哪里去,还重要吗? 大家认为,计算机以后的发展是不是,“程序员越来越不知道一个模式具体怎么运行的,只知道就按某个的规则做就对了”? 就好像这样的编码:{    往 $TABLENAME 这个表里插入界面上的数据} 到底 SqlConnection 怎么来的。由谁来释放它已经不重要了。或者它不会被立刻释放,而转给另外一个地方个处理。而且这个步骤极有可能是被某个事务所操纵着的。 可惜程序员不需要理会这个了。他的职责就是把界面上的数据录入到数据库这个事实告诉给编译器。当2004年的你问起这个未来的程序员,那个语句是运行了什么代码。那个程序员就会答你:“我最讨厌写代码的人在我面前炫耀他那低效率的玩意了!”(就好象我们不太喜欢写汇编的人一样)   我目前在写一个叫 Scoping 的东西。这个东西基于 ContextBoundModel 来实现。 它的概念和COM+的Context有点象。不过不是同一个东西。它是基于 Context 的概念实现的。(就好象TcpClient是基于Socket的一样) 它的目标是,在你需要一个对象的时候,它就有。在真正没有人需要那对象的时候,那对象能自动消失。不同的对象/代码在运行的时候得到的所依赖的同一种对象有可能不是同一个实例。例如一个窗口中,左边是简体,而右边是繁体。当然这个也要自动实现。 也就是说 Scoping 努力做到一个框架,这个框架能释放程序员管理相关资源/对象的工作。这一点是和AOP的思想一致的。Scoping算是AOP的一种应用。 到时候,你就不需要知道一个数据库连接是怎么来的了。一个往数据库录入数据的模块不应该关心数据库怎样连上的。它应该专著于:把DotNet数据转化为SqlParameter然后执行语句。 但是目前的难题,就像文章所说的,就是资源引用问题。一个方法被执行后,假如外界环境知道某些资源是在方法中自动创建的,那外界环境怎样知道方法执行期间,是否有其他的对象仍然使用这个资源?(例如虽然方法返回了,仍然有异步调用的代码在使用着那些资源) 或者我要用引用计数的办法了。但是我希望能得到好的建议。谢谢。    ...[阅读全文]

posted @ | Feedback (9) | Filed Under [ 迷失中 DotNet ]

摘要:今天思归发了 WSE 的随笔。然后 蝈蝈俊 就抱怨 WSE2 好象有点问题。 我也是一个用WebService的人。不过我还没有用到 WSE 。 主要是目前VS2003引用出来的WebService已经够我用了。 如果要传递数据给服务器。但是又不想以方法的参数的形式传过去,那该怎么半?(其实这很像AOP的思想) VS2003例子步骤。首先创建工程WebService1,里面有Service1.asmx,打开,输入:[WebMethod]public string HelloWorld(){   return Context.Request.Headers["Service1UserName"];}这样这个WebService1就完成了。编译好。 创建工程WindowsApplication1,添加 http://localhost/WebService1/Service1.asmx 的引用。把引用的名称定为 Test 添加一个类:namespace WindowsApplication1{ using System; using System.Net; public class Service1 : WindowsApplication1.Test.Service1 {  string un;  public Service1(string username)  {   un=username;  }  protected override WebRequest GetWebRequest(Uri uri)  {   HttpWebRequest request=(HttpWebRequest)base.GetWebRequest(uri);   request.Headers["Service1UserName"]=un;   return request;  } }} 在Form1拖个textBox1和button1进去。然后在button1.Click里: private void button1_Click(object sender, System.EventArgs e){   Service1 s=new Service1(textBox1.Text);   MessageBox.Show(s.HelloWorld());} 这样,整个例子就完成了。 关键的地方就在Service1继承VS2003生成的类。重写方法GetWebRequest,把必要的东西扔进HttpWebRequest 去。例如扔进Headers,CookieContainer,ClientCertificates 这个方法比较简单,容易使用和定制自己的需要。具体的数据怎样加密法。那要看你自己了。 (如果用到DotNet2.0,就可以选择 partial : Partial Type , Visual Basic 2005新功能点评(四)——不完全类型 了)(如果 System.Web.Services.WebService 是继承ContextBoundObject那多好啊。那么就可以用我的 ContextBoundModel 给它加上AOP的支持了。)...[阅读全文]

posted @ | Feedback (1) | Filed Under [ DotNet ]

摘要:ContextBoundModel (以下简称CBM) 是基于 .Net Remoting 的 AOP 开发框架。 之前 JGTM 在 GOTDOTNET 上已经有一个实现。 而CBM则是我在5.1期间内做的。 现在(20040521)是 v0.5 版。一直都没有变成v1.0 Release的原因是有一些东西没有作好,例如生命期控制。另外我还想实现一个Scoping的东西,不过目前被卡住了。 请到  http://www.lostinet.com/files/ 下载 lcbm2004xxxx.rar (源代码以及例子) 如果你想了解什么是 AOP ,那么不要找我。因为我也不清楚。 如果你想用CBM来实现AOP,但是却不清楚Remoting的原理,这个以后多多留意这里好了。我最近会把5.1期间领会到的东西写出来的。   2004-05-24 上次发布的v0.5打包前犯了个低级错误,Impl/RealObectProxy.cs 里的 new public MarshalByRefObject GetUnwrappedServer里应该加上“base.”...[阅读全文]

posted @ | Feedback (11) | Filed Under [ DotNet ]

摘要:从各公司的招聘的题目看来,好象算24是一个经典的题目。 这个是我出的: 9962,7733,7744,1456,1346 星期二公布答案....[阅读全文]

posted @ | Feedback (486) | Filed Under [ 迷失中 ]

摘要:今天研究一下ServicedComponentProxyAttribute,发现它实现了 ICustomFactory 。 但是我测试过它并不能使普通的MarshalByRefObject变成ContextBoundObject那样支持ProxyAttribute...[阅读全文]

posted @ | Feedback (0) | Filed Under [ DotNet ]

摘要:旧事重提了,或许很多人会奇怪,为什么 C# 不允许lock一个struct ? 例如: public void ProcessTask(int taskid){    lock(taskid){  .....   }} 编译说lock只能使用引用类型。有些人聪明(我想我以前也有这样的"聪明"。。),这样做: lock((object)taskid){...} 但是,实际的经验告诉我,这样行不通,lock需要的是引用,严格来说是需要对象的实例。 即使对象在意义上是相同的,但是如果不是ReferenceEquals的话,那么将作为两个实例来对待,那么C# lock 的就不是同一个东西。也就是说,当你以为这个 lock 生效的话,它其实在做无用工。 在上面的例子,由于lock((object)taskid)每执行一次,taskid都进行一次装箱,而装箱后的对象不是同一个实例(都是完完全全的新的实例),所以 lock((object)taskid){...} 是白做了。 当然,lock((object)123){} 这样的做法也是一样有问题的。 但是这种就好点:lock(“helloworld“){} 。为什么只是“好点”,而不是“没有问题”了呢。原因在于DotNet分配字符串的机制。DotNet为每个Assembly里的字符串都分配固定的空间。所以每次引用“helloworld“的时候,是同一个实例。但是这个字符串不会在其他Assembly中得到共用。如果几个Assembly都是这样写的,那么它们各自有她们自己的“helloworld“ 比较好的做法: lock(this)... lock(typeof(ThisType)) lock(GetType())//除非你明白这是干什么,否则不要乱来。 lock(SomeType.StaticSyncObject) lock(someinst.SyncObject) 其他的一些不好的做法 lock(“task:“+id) lock(filename) 当然,具体lock什么东西,是设计上的协议和规范。不过要注意的是,使用lock必须明确对象是不是想象中的同一实例。 如果需要针对一个变化的值,从它的意义上的Equals方面进行 lock ,那怎么办?这个可以参考  http://www.lostinet.com/files/ 下的 HashCodeLock (里面很多细节可以优化)...[阅读全文]

posted @ | Feedback (9) | Filed Under [ DotNet ]

摘要:系统是 Windows2003StandardEdition . 但是遇到两个问题: 一: IIS 网站/目录/文件 的属性框刚打开就立刻非法操作。 二: MSN Messager 无法登陆。 所有的补丁都打完了。 有没有人遇到过?有没有好的解决方法。...[阅读全文]

posted @ | Feedback (29) | Filed Under [ 迷失中 ]

摘要:ThreadStaticAttribute 的作用是告诉CLR,它标记的静态字段的存取是依赖当前线程,而独立于其他线程的。 例如: class MyClass{    [ThreadStatic] static public string threadvalue;} MyClass 中的threadvalue就是一个线程静态字段 。 如果一个程序中同时有多个线程同时访问这个字段,则每个线程访问的都是独立的threadvalue 。例如线程1设置它为”hello”,然后线程2设置它为”world”,最后线程1读取它的时候,得到的是”hello”。 基于这个,线程静态字段有以下特征: 它是静态的字段。所以不需要MyClass的实例,直接用 MyClass.threadvalue的形式来访问就可以了。 它的存取是根据线程来指定内存位置的,所以它的存取速度较慢。 访问线程静态字段不可能发生线程不同步问题。因为虽然语意上不同线程访问的是同一字段,但实际上不同线程访问的是不同的内存块。 一条线程不可能访问到另外一条线程上的线程静态字段。就算你得到另外一条线程的System.Threading.Thread 对象的引用也不行。 但是,使用线程静态字段要注意: 字段上的初始化语句在类的静态构造方法中执行。所以语句只执行一句。其他线程再访问这个字段时,为字段的类型的默认值。 如果不同线程上的字段都引用同一对象,那么不代表该对象是线程同步的。因为[ThreadStatic]指的是字段是隔离的。但是它引用的对象则不被[ThreadStatic]控制。 如果你知道 System.Runtime.Remoting.Messaging.Context (以下简称MContext)那么MContext和线程静态字段有什么不同呢? 他们可以说都是与当前线程相关的。但是他们不是同一个东西。 MContext是基于名称的,可以根据名称储存不同的数据。而ThreadStatic不会有名称冲突。 ThreadStatic 是CLR内部实现的。而 MContext 是附属在 System.Threading.Thread 对象的一个字典。 线程静态字段的存取速度比MContext的快 MContext被叫做逻辑线程上下文数据。它的数据会在异步调用的时候复制到另外一条线程中。而线程静态字段是不会被复制的。(例如 eventHandlerInst.BeginInvoke(...)时,在新的线程中,就拥有原线程上MContext的数据。在eventHandlerInst.EndInvoke执行时,新线程上的MContext上的数据就会还原到调用EndInvoke的线程上.这个在以后讲到Remoting时会详细说) System.Web.HttpContext.Current 是用 MContext 实现的。 [ThreadStatic]的一些应用的例子? 你可能需要模仿HttpContext,弄个MyClass.Current , 或者根据Singleton模式,弄个ThreadSingleton . 你可能会有工作线程。你以往是通过线程上传递一个对象用于共享数据的。这样所有的对象啊,方法啊都变得怪怪的。现在你可以把这些数据直接以[ThreadStatic]的形式存取了。 你可能需要弄个这样的类://未经测试 public class ConnHolder : IDisposable { [ThreadStatic] SqlConnection threadconn; bool createbyme=false; public ConnHolder() { if(threadconn==null) { threadconn=new SqlConnection(Config.ConnectionString); createbyme=true; } } public SqlConnection Connection { get { SqlConnection conn=threadconn; if(conn.State!=ConnectionState.Open) { conn.Open(); } return conn; } } public void Dispose() ......[阅读全文]

posted @ | Feedback (4) | Filed Under [ DotNet ]

摘要:今天是来博客堂报到的日子。纪念一下。 随想、文章、广告。。。等会慢慢来这里报道的。:) 一些关于我的信息: Lostinet  ,  戴立坚,珠海,81.10 http://www.lostinet.com/ MSN : lostinet@lostinet.com                                                                         上海 2004-05-20...[阅读全文]

posted @ | Feedback (15) | Filed Under [ 迷失中 ]