|
|
2006年12月22日
摘要:
Inversion Of Control 控制反转,一种为灵活解决应用内部各部件耦合关系的编程理念,随着Martin Fowler一篇< >为其正名,近年来在JAVA界可说是风起云涌,夸张一点的可以说“不反转控制一下都不好意思说是搞JAVA的",一本Rod Johnson的<>几乎是JAVA程序员人手一册的红宝书.
当然.NET也未能'幸免于难',虽然没有像Spring.picoContainer那么众多大牌,可也随着Castle这支先遣部队,也让各位.NETer过了一把ioc瘾.
究竟它有什么魔力让众人这么趋之若鹜呢?迟到总比不到好,因此边学边记下笔记.
阅读全文
2006年12月20日
准备工作 现在手头还没有Spring.NET的朋友,先让我们来到 这里下载一份(出于功能考虑推荐使用1.1 Preview 3版的) 如同使用其他第三方工具一样,依据.NET版本引用好Spring.Core.dll程序集,然后在配置文件中加入这么一段 step 1:
<configSections>
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
</sectionGroup>
</configSections>

<spring>
<context>
<resource uri="config://spring/objects"/>
</context>
<objects xmlns="http://www.springframework.net">

</objects>
</spring>
OK,第一步工作做好. 不知道,各位在外漂泊的单身汉是不是有跟我一样的苦恼: 快餐吃来吃去,晚上经常不知道吃啥好,得,我就拿这个做DEMO吧. 先定义一个接口咯 step2:
public interface 晚上吃啥
  {
void 吃饭();
}
口味比较重,一般比较喜欢[吃辣椒炒肉褒仔饭] 和 [吃水煮鱼] step3:
public class 吃辣椒炒肉煲仔饭 : 晚上吃啥
  {
public void 吃饭()
 {
Console.WriteLine("吃辣椒炒肉煲仔饭咯");
}
}

public class 吃水煮鱼 : 晚上吃啥
  {
public void 吃饭()
 {
Console.WriteLine("吃水煮鱼咯");
}
}


写好了,我也决定了:水煮鱼 在config文件的<objects></objects>之间加上一句 step 4:
<objects xmlns="http://www.springframework.net">

<object id="晚餐" type="SpringDemo_1.吃水煮鱼,SpringDemo_1" />

</objects>
美食当前,具体怎么享用呢? 看这里 step 5:
[STAThread]
static void Main(string[] args)
 {
Spring.Context.IApplicationContext ctx =
Spring.Context.Support.ContextRegistry.GetContext();

晚上吃啥 temp = ctx["晚餐"] as 晚上吃啥;

temp.吃饭();
}
运行一下, 看到结果了吧 hoho~~
-------------------------------------------------------------------------- 现在让我们回过过头来看看,具体每一步都做了什么
step 1: <configSections></configSections> 配置节,定义了<spring>配置组 <context><resource uri="{0}" /></context> Spring.NET里默认提供了三种资源描述方式: 1) <resource uri="config://spring/objects" /> 表示在config配置文件的<spring><objects>配置节内部定义了<object /> 2) <resource uri="~/yourAppContext.xml" /> 表示在程序的根目录下的yourAppContext.xml文件里定义了<object /> 3)<resource uri="assembly://assemblyName/namespace/yourAppContext.xml" /> 表示yourAppContext.xml设为了嵌入式资源,并在其中定义了<object />
step 2:
自定义的行为规范
step 3:
行为规范的具体实现
step 4 :
通过Spring.NET的IoC容器来配置由哪个符合行为规范的对象来执行行为
step 5:
执行行为,具体由谁执行,调用者(main()方法)不知情。
-------------------------------------------------------------------------------
环境: .net 1.1 , Spring.NET 1.1 Preview 3 源码: 这里
关于Spring.NET
Spring.NET作为着力于帮助构建.NET企业级应用的应用程序框架,它在各个功能领域提供了广泛支持,诸如依赖注入,面向方面编程,数据处理的抽象以及与ASP.NET的集成.
Spring.NET包含了许多特性:

1.0版中提供了完整的IoC容器以及AOP库,1.1版中还将包括Web,ORM,以及Data模块,另外还有一部分内容将作为独立模块提供给用户,例如Spring.Data.NHibernate等.
------ 以上 摘自 <<Spring.NET Reference>>
Spring.NET作为一款'重量级'的来自JAVA界的轻量级应用程序框架,在其兄弟Spring在JAVA界俨如有一家独大的势头之时,在.NET上的发展却一直不温不火,一方面由于其周遍扩展尚不完善:没有像JAVA平台上对Jdbc,Hibernate那样对Ado.NET,NHibernate提供友好集成;另一方面,有Castle这位先行者同样集成有IoC容器,Web框架,NHibernate的二次包装的ORM实现. 真可以说是你有张良计,我有过墙梯.(当然像Spring这种天生关注软件开发过程中可能产生变化和支解耦合的Framework,在国内.net界崇尚Rad的普遍氛围下也可以说有点水土不符了)
不过,通过不久前发布的Spring.NET 1.1 Preview 3 - 作为正式发布前的最后一个测试版,我们已经可以大体上了解到0.1的版本升级意味着什么: 支持asp.net页面注入,双向的数据绑定,为asp.net 1.1提供母版页支持; 对ado.net,NHibernate 提供集成支持 对数据处理提供编程式以及声明式事务支持 对remoting,企业服务以及web服务提供集成支持
相关: www.springframework.net
2006年9月7日
1. sqlserver2k 必须安装sp4补丁 (2005未测试) 否则使用SqlWorkflowPersistenceService 和SqlWorkflowTrackingService时会报错 http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=182546&SiteID=1
2. web.config 添加配置 <WorkflowRuntime Name="WorkflowServiceContainer"> <CommonParameters> <add name="ConnectionString" value="Initial Catalog=SharedStore;Data Source=localhost;Integrated Security=SSPI;"/> </CommonParameters> <Services> <add type="System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35"/> <add type="System.Workflow.Activities.ExternalDataExchangeService, System.Workflow.Activities, Version=3.0.00000.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35"/> <add type="System.Workflow.Runtime.Hosting.SharedConnectionWorkflowCommitWorkBatchService, System.Workflow.Runtime, Version=3.0.00000.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> <add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35" UnloadOnIdle="true"/> <add type="System.Workflow.Runtime.Tracking.SqlTrackingService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35"/> </Services> </WorkflowRuntime>
即可以使用类似 SqlWorkflowPersistence persist = runtime.GetService<SqlWorkflowPersistence>(); 的方法获取Service 要不然只能通过如此冗长的方式 SqlWorkflowPersistence persist = new SqlWorkflowPersistence ( connectionString,UnloadOnIdle,timeSpan,timeSpan);
添加 <add name="WorkflowHost" type="System.Workflow.Runtime.Hosting.WorkflowWebHostingModule, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> 到 <httpModules></httpModules> 节
3. 当persistenceService 和trackingService使用在同一个数据库里时 必须添加SharedConnectionWorkflowCommitWorkBatchService
4. 新建工作流程Service时必须添加[ExternalDataExchange]Attribute wwf与host通信时使用的class必须添加[Serializable],可供序列化
5. asp.net环境下使用ManualWorkflowSchedulerService 默认单进程 使用scheduler.RunWorkflow(instanceId)驱动工作流程
一些资源 http://www.theserverside.net/tt/articles/showarticle.tss?id=ManageAppProcesses http://www.theserverside.net/tt/articles/showarticle.tss?id=WorkforProcess http://mtaulty.com/communityserver/blogs/mike_taultys_blog/default.aspx http://forums.microsoft.com/msdn/showforum.aspx?forumid=122&siteid=1 http://biztalkgurus.com/windows-workflow-foundation.aspx http://blogs.msdn.com/jamescon/
希望能够与大家多交流 学习 一个人学真的走了好多弯路 -_-
2005年11月28日
Ver: asp.net 1.1
1.当Repeater内嵌TextBox时,使用aspnetpager分页控件后,在ItemDataBind事件中得不到该控件
void rpt_ItemDataBind(sender,e)
  {
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
 {
TextBox tb = e.Item.FindControls("tbId") as TextBox;
// tb = null ,here
}

} 解决方法:
应该把aspnetpager的 PagerChanged事件委托添加的代码 从
private void InitializeComponent()
 {
this.Load += new System.EventHandler(this.Page_Load);
this.pager1.PageChanged += new Wuqi.Webdiyer.PageChangedEventHandler(pager1_PageChanged); // bug, here

} 改为Page_Load事件里即可
2.使用IEWEBCONTROLs中的TreeView控件时指定SelectedStyle颜色不正确
解决办法:
在Style集合中添加此句 : filter: none;
估计是MS在客户端描绘树时使用了滤镜
2005年11月7日
这次公司的项目规模不大,因此决定尝试使用一下NHibernate来处理数据访问.
感觉对比以往使用Ado.Net有了满大不同,带来了不少方便,也导致有些地方不习惯.
比如,以往使用XMLHTTP向页面提交请求时,由于DataSet直接有WriteXml方法 可以很轻易的获得需要访问的数
据的xml文件,但NHibernate取得的实体集合List并为提供相应方法,怎么办?
途中想了n多办法,什么运行时反射实例属性 自写xml文件啊 一堆东西,结果居然将最基本的xml序列化给忘了,该打
-_____________-
思路有了,就很简单,直接Serialize至Response.OutputStream 发送 , 整个世界都安静了.
自毕业后从事.net工作,流连于cnblog差不多一年时间了.
无论是软件技术上,还是处事心态上都从各位博客身上学到了很多.
平时都没有做记录的习惯,便把今日作为一个起点,将生活,技术上的感悟都记录于此,
以备后来自己看到这些文字有巩固,警醒,怀念之用.
|