Pregunta

Estoy trabajando en una demo que hace uso de la capacidad Spring.NET COI en ASP.NET MVC. Es algo así como la aplicación MyBlog presentado en la programación en parejas tutorial de vídeo en el sitio www.asp.net. He completado la misma demostración usando marco de la Unidad de Microsoft y ahora quiere probar el contenedor de primavera. Con ese fin he implementado un IControllerFactory simple que primero crea la factoría de objetos primavera como esta:

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

y al lado se pone el controlador de esa fábrica así:

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

(error manipulación despojó a efectos de simplificación).

Ahora en algún lugar de mi HomeController tengo este tipo de acción:

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

Y aquí está la parte de vista AddEntry.aspx que define los editores para el parámetro de entrada (cosas muy básico):

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

Ahora aquí está el reparto: Cuando estoy usando el COI unidad funciona como un encanto. parámetro "entrada" se deserialized de mi forma como debería y la línea

entry.EntryDate = DateTime.Now; 

completa y sin problemas.

Sin embargo, cuando me cambio a Spring.NET factoría de objetos (como se describió anteriormente) cosas empiezan a volverse loco. En primer lugar la "entrada" parámetro activa nula por lo que se produce una excepción. Para rastrear el posible problema en mi final he implementado una especie de IModelBinder a medida que se parece a lo siguiente:

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

Cuando vengo aquí utilizando el marco de la Unidad y la profundización desde BindingContext a HttpRequest veo que el Request.HttpMethod es "POST" y Request.Form se llena correctamente. Cuando hago lo mismo utilizando el método Spring.NET es "GET" y Request.Form está vacía. Sin embargo, cuando me paso a mi acción del controlador (addEntry) y profundizar en la Solicitud en ambas situaciones veo que el Request.HttpMethod y Request.Form tienen sus valores propios.

Ahora la pregunta es ¿cómo puedo solucionar la versión con Spring.NET para que funcione igual que el que utiliza la Unidad marco?

¿Fue útil?

Solución

He encontrado la respuesta!

Mi definición de objeto parecía que:

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

No importa las propiedades están estableciendo lo que realmente hace es que devuelve la misma instancia cada vez que pido para este objeto utilizando

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

Así que cuando he cambiado la definición de

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

todo empezó a funcionar bien.

Saludos cordiales, Matthias.

Otros consejos

Sólo una nota adicional para aclarar este comportamiento: Los controladores son tratados como prototipos por el marco ASP.NET MVC, pero por defecto Spring a modo de Singleton. Por lo tanto usted necesita para marcar explícitamente su objeto como no Singleton en la configuración del contenedor. El próximo módulo de integración Spring MVC se hará cargo de esto, por lo que no se ejecutará en este momento.

hth, Erich

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top