Domanda

Sto lavorando a una demo che fa uso di capacità Spring.NET IoC in ASP.NET MVC. E 'un po' come l'applicazione MyBlog presentato sulla coppia di programmazione video tutorial sul sito www.asp.net. Ho completato la stessa demo utilizzando il framework Unità di Microsoft e ora voglio provare il contenitore di primavera. A tal fine ho implementato un semplice IControllerFactory che prima crea la fabbrica oggetto primavera così:

IObjectFactory factory;
(....)
factory = new XmlObjectFactory(new FileSystemResource(application.Server.MapPath("objects.xml")))

e successivo ottiene il controller da quella fabbrica di simile:

public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) {
    IController result = context.GetObject(controllerName) as IController;
    return result;
}

(Gestione degli errori messo a nudo a fini di semplificazione).

Ora da qualche parte nel mio HomeController ho questo tipo di azione:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AddEntry([Bind] BlogEntry entry, int id) {
    entry.EntryDate = DateTime.Now;
....

Ed ecco la parte di vista AddEntry.aspx che definisce gli editori per il parametro d'ingresso (roba veramente di base):

<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>

Ora ecco l'affare: Quando sto con l'Unità IoC funziona come un fascino. "Entry" parametro viene deserializzato dalla mia forma come dovrebbe e la riga

entry.EntryDate = DateTime.Now; 

completata senza problemi.

Tuttavia quando passo a Spring.NET fabbrica oggetto (come descritto sopra) le cose cominciano ad andare dadi. Prima di tutto la "entry" parametro trasforma null quindi viene generata un'eccezione. Per tracciare il possibile problema da parte mia ho implementato una sorta di IModelBinder personalizzata che assomiglia a quanto segue:

public class BlogEntryBinder : IModelBinder {
    public ModelBinderResult BindModel(ModelBindingContext bindingContext) {
        ModelBinderResult result = ModelBinders.DefaultBinder.BindModel(bindingContext);
        return result;
    }
}

Quando vengo qui utilizzando il framework Unità e drill-down da BindingContext a HttpRequest vedo che il Request.HttpMethod è "POST" e Request.Form è correttamente riempito. Quando faccio lo stesso con Spring.NET il metodo è "GET" e Request.Form è vuoto. Quando però faccio un passo alla mia azione di controllo (AddEntry) e drill-down per la richiesta in entrambe le situazioni vedo che il Request.HttpMethod e Request.Form hanno i loro valori corretti.

Ora la domanda è come posso risolvere la versione con Spring.NET in modo che funziona proprio come quella che usa quadro Unità?

È stato utile?

Soluzione

Ho trovato la risposta!

La mia definizione di oggetto sembrava che:

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

Nevermind le proprietà di essere impostate ciò che in realtà non fa altro che restituisce la stessa istanza ogni volta che chiedo per questo oggetto usando

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

Così, quando ho cambiato la definizione di

<!-- 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>

tutto quello che ha iniziato a lavorare bene.

Con i migliori saluti, Mattia.

Altri suggerimenti

solo una nota complementare per chiarire questo comportamento: Controller sono trattati come prototipi da parte del framework ASP.NET MVC, ma di default primavera modalità Singleton. Pertanto è necessario marcare in modo esplicito l'oggetto come non-Singleton nella configurazione contenitore. Il prossimo modulo di integrazione Spring MVC si prenderà cura di questo, in modo da non incorrere in questo allora.

hth, Erich

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top