spring.net 开发团队正在加紧进行0.6版本的发布
从cvs来看,0.6正在进一步顺应.net的习惯,像配置文件中,class attribute修改成type,map element为dictionary。移去了IDisposableObject 接口,替换为.net 内置的IDisposable接口。
除了随spring.web引入的 object navigation外,Spring.Pool,Spring.Threading也被加入到spring.net中
随着castle 的推出,spring.net现在有了一个竞争对手了,这是件好事。当前,spring.net除了核心,在实际的开发中缺少帮助,如
spring.data
显然,从IAdoOperations接口和SqlClientTemplate来看,spring.data已经不同spring java的版本。在java实现中,基于接口的匿名类回调是其主要特点。而在spring.net 中,IAdoOperations仅仅是映射microsoft application data block
当然,这是因为C#没有匿名类,只有C# 2.0有匿名方法,这是迁移的最大障碍。但显然,spring.net 不会扔下.net 1.1.
在邮件列表中,关于是否顺应java版本的设计有个讨论
开发者(Griffin)发表了他的观点,主要如下:
Definitely. I think that the data access code ( ADO.NET ) is radically
different than JDBC. (ado.net从根本上不同于jdbc)
It's typical in the .NET world to use DataSets AS business objects.(在.net中,典型的用dataset表现商业对象)
作者显然很喜欢强类型的dataset,这意味着,可能无法在spring.net中看到java方式的数据访问代码.我个人喜欢java版本的设计.但我也认为,明确ado.net和jdbc的差异是有益的.
用强类型dataset完成entity层设计,无需学习nhibernate之类的ormapping工具.是一种quick and dirty的解决方案.可以预见的事,我会在今后的小项目中采用这种方案.
spring.web
显然,spring.web当前没有提出一个mvc的框架,是在准备中,还是根本没有?
spring.service
cvs上当前是的对Remoting 的支持,对windows service的支持可在http://it.geocities.com/fspinazzi/Spring.Service.2.zip 下载 这部分没什么可说的
因此,有人建议更多的引入其他的解决方案,如
如引入.net mvc2的框架 NWAF:
http://www.codeproject.com/aspnet/NWAF.asp
http://weblogs.asp.net/ngur/archive/2004/11/30/272489.aspx
spring.web 的作者Aleksandar Seovic随后在邮件列表中介绍了其开发思路
1. "Code behind" classes will be used as controllers.
2. Event handlers, either within the code behind class or in
external class will represent actions.
3. Views will be defined in .aspx files
4. Any object can represent a model
并对nwaf做了一些评论
显然,这说明了我们的一个疑问,在spring.web中不会有mvc 了,从这些观点来看,Aleksandar Seovic的开发观点是相当实际的,从我实际的开发来看。这样做没有什么问题。
从作者的观点来看,作者推荐使用event handler,推荐使用event handler,来表达活动或转向
2005-1-28日 cvs检入了result的支持代码
通过在基类Page中增加一个Results dictionary来完成,在需要转向时调用SetResult(resultname)
允许使用字符串或Result类的实例来表达一个Result,Result类有一个TargetPage属性,表示需要转向的页面,Mode表示转向的方式(Redirect或Transfer),Parameters表示参数,如
<object name="list" type="Spring.Web.Support.Result,Spring.Web">
<property name="TargetPage"><value>employeelist.spring</value></property>
<property name="Mode"><value>Redirect</value></property>
</object>
<object name="addEmployee" type="~/form/addemployee.aspx">
<property name="Results">
<dictionary>
<entry key="list"><ref object="list"/></entry>
<entry key="list2"><value>transfer:employeelist.spring</value></entry>
</dictionary>
</property>
</objects>
字符串可以用transfer:或redirect:开头,?后的将解析为参数
用事件进行result处理(只是我的想法,并没有实用价值,暂时保留在这里吧)
一个page
<object name="addEmployee" type="~/form/AddEmployee.aspx">
</object>
需要一个service类
<object name="employeeService" type="Spring.Sample.EmployeeService,Spring.Sample"/>
进行依赖注入
<object name="addEmployee" type="~/form/addEmployee.aspx">
<proprty name="EmployeeService"><ref object="employeeService"/></property>
</object>
声明一个事件
声明一个AddEmployeeComplete事件,当新增动作完成时触发
//code behind 类表现为controller
public class AddEmployee : Spring.Web.UI.Page
{
//事件表达活动
private event EventHandler AddEmployeeComplete;
//绑定model
[Binding("Text",Employee.Name()]
protected TextBox txtName;
protected Button cmdAdd;
//通过ioc实现依赖注入
public IEmployeeService EmployeeService;
//任何对象表达为model
private Employee employee;
public Employee Employee{
get{
if (employee==null)
employee=new Employee();
return employee;
}
}
private void cmdAdd_Click(object sender ,EventArgs e)
{
EmployeeService.AddEmployee(employee);
if (ADdEmployeeComplete!=null)
AddEmployeeComplete(employee,EventArgs.Empty);
}
}
一个事件订阅类
public class ApplicationDispatcher
{
public void OnAddEmployeeComplete(object sender,EventArgs e)
{
HttpContext.Current.Response.Redirect("~/list.spring");
}
}
全部声明
<object name="addEmployee" type="~/form/addEmployee.aspx">
<proprty name="EmployeeService"><ref object="employeeService"/></property>
</object>
<object name="dispatcher" type="Spring.Sample.ApplicationDispatcher,Spring.Sample">
<listener event="AddEmployeeComplete" method="OnAddEmployeeComplete">
<ref object="addEmployee"/>
</listener>
</object>
跟踪spring.net 的开发过程非常有益,从简单的认为java的设计优良,到更多的去体现.net的特质.我想,我们得确需要多一点思考,而不是一味的盲从.