Question

Je travaille sur une démo qui utilise la capacité Spring.NET dans ASP.NET MVC IoC. Il est un peu comme l'application MyBlog présenté sur tutoriel vidéo de programmation paire sur le site www.asp.net. J'ai terminé la même démonstration en utilisant le cadre fédérateur de Microsoft et que vous souhaitez maintenant essayer le conteneur Spring. À cette fin, j'ai mis en place simple IControllerFactory qui crée d'abord l'usine d'objet Spring comme ça:

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

et ensuite il obtient le contrôleur de cette usine comme ça:

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

(traitement des erreurs dépouilla à des fins de simplification).

quelque part dans mon HomeController je ce genre d'action:

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

Et voici la partie de vue AddEntry.aspx qui définit les rédacteurs en chef pour le paramètre d'entrée (stuff vraiment de 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>

Maintenant, voici l'affaire: Lorsque j'utilise l'unité IoC cela fonctionne comme un charme. paramètre « entrée » se désérialisée de ma forme comme il se doit et la ligne

entry.EntryDate = DateTime.Now; 

se termine sans problème.

Cependant, quand je passe à l'usine d'objets Spring.NET (comme décrit ci-dessus) les choses commencent à aller noix. D'abord « l'entrée » tous les paramètres se nulle si une exception est levée. Pour suivre le problème possible sur ma fin, j'ai mis en place une sorte de IModelBinder personnalisé qui ressemble à ça:

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

Quand je viens ici en utilisant le cadre de l'unité et de forer vers le bas BindingContext à HttpRequest je vois que le Request.HttpMethod est « POST » et Request.Form est correctement rempli. Quand je fais la même chose en utilisant Spring.NET la méthode est « GET » et Request.Form est vide. Cependant, lorsque je fais un pas à mon action du contrôleur (AddEntry) et développiez le demande dans les deux situations, je vois que les Request.HttpMethod et Request.Form ont leurs propres valeurs.

Maintenant, la question est de savoir comment puis-je corriger la version avec Spring.NET pour que cela fonctionne comme celui qui utilise le cadre Unity?

Était-ce utile?

La solution

Je l'ai trouvé la réponse!

Ma définition de l'objet ressemblait à ça:

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

les propriétés de Nevermind étant mis ce qu'il fait est retourne la même instance chaque fois que je demande à cet objet en utilisant

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

Alors, quand je l'ai changé la définition à

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

tout a commencé à travailler très bien.

Cordialement, Matthias.

Autres conseils

juste une note supplémentaire pour clarifier ce comportement: Les contrôleurs sont traités comme des prototypes par le framework ASP.NET MVC, mais par défaut de printemps en mode singleton. Par conséquent, vous devez marquer explicitement votre objet comme non-singleton dans la configuration du conteneur. Le module d'intégration à venir Spring MVC prendra soin de cela, de sorte que vous ne fonctionnera pas dans ce moment-là.

HTH, Erich

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top