我正在使用ASP.NET MVC中的Spring.NET IoC功能的演示。這有點像www.asp.net網站上配對編程視頻教程中介紹的MyBlog應用程序。我已經使用微軟的Unity框架完成了相同的演示,現在想試試Spring容器。 爲此我已經實現了一個簡單的IControllerFactory首先創建彈簧的對象工廠這樣的:ASP.NET MVC與Spring.NET和ModelBinder
public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) {
IController result = context.GetObject(controllerName) as IController;
return result;
}
(錯誤處理:
IObjectFactory factory;
(....)
factory = new XmlObjectFactory(new FileSystemResource(application.Server.MapPath("objects.xml")))
和明年它從工廠那樣得到控制爲簡化目的而被剝離)。
現在的地方在我的HomeController我有這樣的動作:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AddEntry([Bind] BlogEntry entry, int id) {
entry.EntryDate = DateTime.Now;
....
及這裏的定義輸入參數(真的基本的東西)編輯AddEntry.aspx視圖的一部分:
<form method="post" action="/Home/AddEntry/<%= ViewData["id"] %>">
<table>
<tr>
<td><label for="Title">Title</label></td>
<td><input name="entry.Title" type="text"/></td>
</tr>
<tr>
<td><label for="Text">Content</label></td>
<td><input name="entry.Text" type="text"/></td>
</tr>
</table>
<br />
<input type="submit" value="Add entry" />
<input type="button" value="Cancel" onclick="history.back(-1);" />
</form>
現在,這裏的交易: 當我使用Unity IoC時,它就像一個魅力。 「入口」參數從我的表單中得到反序列化,就像它應該和行
entry.EntryDate = DateTime.Now;
完成沒有問題。
但是,當我切換到Spring.NET對象工廠(如上所述)時,情況開始變得瘋狂。首先參數「entry」變爲null,以便引發異常。 要跟蹤我的結束可能出現的問題,我實現了一種定製IModelBinder的,看起來像:
public class BlogEntryBinder : IModelBinder {
public ModelBinderResult BindModel(ModelBindingContext bindingContext) {
ModelBinderResult result = ModelBinders.DefaultBinder.BindModel(bindingContext);
return result;
}
}
當我來到這裏使用統一的框架,並從BindingContext中向下鑽取的HttpRequest我看到請求.HttpMethod是「POST」,並且Request.Form已被正確填充。當我使用Spring.NET做同樣的事情時,方法是「GET」,Request.Form是空的。 但是,當我步入我的控制器操作(AddEntry)並深入到這兩種情況下的請求時,我發現Request.HttpMethod和Request.Form具有它們的適當值。
現在的問題是如何使用Spring.NET修復版本,以便它像使用Unity框架一樣工作?