Frage

Ich arbeite gerade an einer Demo, die Verwendung von Spring.NET IoC Fähigkeit in ASP.NET MVC macht. Es ist eine Art, wie die MyBlog Anwendung auf Pair Programming Video-Tutorial auf www.asp.net Website präsentiert. Ich habe die gleiche Demo mit Microsofts Unity Rahmen abgeschlossen und will nun den Frühling Behälter auszuprobieren. Zu diesem Zweck habe ich eine einfache IControllerFactory implementiert, die zuerst die Feder Objekt Fabrik wie das schafft:

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

und nächstes wird es den Controller aus dieser Fabrik wie folgt aus:

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

(Fehler zur Vereinfachung gestrippt Behandlung).

Jetzt irgendwo in meinem Homecontroller Ich habe diese Art von Aktion:

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

Und hier ist der Teil der AddEntry.aspx Ansicht, dass die Editoren für Eingabeparameter (wirklich grundlegende Dinge) definiert:

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

Hier ist der Deal: Wenn ich die Unity IoC bin mit es funktioniert wie ein Charme. „Eintrag“ Parameter werden aus meiner Form, wie es sollte, und die Zeile

deserialisiert
entry.EntryDate = DateTime.Now; 

vervollständigt ohne Probleme.

Allerdings, wenn ich wechseln Spring.NET Objekt Fabrik (wie oben beschrieben), die Dinge beginnen Nüsse zu gehen. Zunächst wird der Parameter „Eintrag“ wird null, so wird eine Ausnahme ausgelöst. Um das mögliche Problem auf meinem Ende zu verfolgen habe ich eine Art von benutzerdefinierten IModelBinder implementiert, die so aussieht:

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

Wenn ich komme hier den Unity-Framework und Drill-Down von Binding zu Httprequest Ich sehe, dass die Request.HttpMethod ist „POST“ und Request.Form richtig gefüllt. Wenn ich das gleiche tun mit Spring.NET die Methode „GET“ und Request.Form ist leer. Wenn jedoch Schritt ich zu meiner Controller-Aktion (AddEntry) und einen Drilldown auf die Anforderung in beiden Situationen, die ich sehe, dass die Request.HttpMethod und Request.Form haben ihre richtigen Werte.

Nun ist die Frage, wie kann ich die Version mit Spring.NET beheben, so dass es genau wie der funktioniert, die Unity-Framework verwendet?

War es hilfreich?

Lösung

Ich habe die Antwort gefunden!

Meine Objektdefinition sah wie folgt aus:

<!-- 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 die Eigenschaften festgelegt wird, was er tatsächlich tut, ist es die gleiche Instanz zurückgibt jedes Mal frage ich für dieses Objekt mit

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

Wenn ich also die Definition geändert haben

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

alles begann gut funktionieren.

Mit freundlichen Grüßen, Matthias.

Andere Tipps

nur ein zusätzlicher Hinweis für dieses Verhalten zu klären: Controllers als Prototypen durch den ASP.NET MVC-Framework behandelt werden, aber Frühling standardmäßig Singleton-Modus. Daher müssen Sie explizit das Objekt als nicht-Singleton im Container Konfiguration markieren. Das kommende Spring MVC-Integrationsmodul wird darum kümmern, so dass Sie nicht dann in diesen ausgeführt werden.

hth, Erich

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top