2008-12-29 96 views
3

我正在使用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框架一樣工作?

回答

4

我找到了答案!

我的對象定義看上去像是:

<!-- Controlers --> 
<object name="Home" type="MyBlog.Controllers.HomeController"> 
    <property name="BlogService" ref="BlogService" /> 
    <property name="BlogEntryService" ref="BlogEntryService" /> 
    <property name="BlogEntryCommentService" ref="BlogEntryCommentService" /> 
</object> 

沒關係的屬性被設置其實際作用是每當我尋求使用

IController result = context.GetObject(controllerName) as IController; 

所以,當這個對象時返回相同的實例我改變了定義爲

<!-- Controlers --> 
<object name="Home" type="MyBlog.Controllers.HomeController" singleton="false"> 
    <property name="BlogService" ref="BlogService" /> 
    <property name="BlogEntryService" ref="BlogEntryService" /> 
    <property name="BlogEntryCommentService" ref="BlogEntryCommentService" /> 
</object> 

一切都開始工作ju很好。

此致敬禮, 馬蒂亞斯。

2

只是一個額外的說明來澄清此行爲:控制器被視爲ASP.NET MVC框架的原型,但Spring默認爲單身模式。因此,您需要在容器配置中將對象顯式標記爲非單例。即將到來的Spring MVC集成模塊將照顧到這一點,所以你不會遇到這個問題。

hth, Erich