我工作的一个演示,使得使用在ASP.NET MVC Spring.NET的IoC能力。这有点像结对编程视频教程介绍了www.asp.net网站上的应用程序MyBlog。我已经完成了使用微软的统一框架同样的demo,现在想尝试一下Spring容器。 为此,我实现一个简单的IControllerFactory首先创建弹簧对象工厂那样:

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

和下它从工厂那样得到,所述控制器:

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

(处理剥离为了简化目的误差)。

现在的地方在我的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>

现在这里的交易: 当我使用的是统一的IoC它就像一个魅力。 “入口”参数被从我的形式像它应该和反序列化线

entry.EntryDate = DateTime.Now; 

完成而没有问题。

然而,当我切换到Spring.NET对象工厂(如上述)的事情开始去螺母。首先在参数“入口”的转空,因此会抛出异常。 要跟踪在我结束可能出现的问题,我实现了一种定制IModelBinder的,看起来像:

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

当我来到这里使用统一的框架,并从BindingContext中向下钻取的HttpRequest我看到Request.HttpMethod是“POST”到Request.Form正确填写。当我使用Spring.NET的方法是做同样的“GET”和的Request.Form是空的。 然而,当我一步到我的控制器行动(的AddEntry)并深入到这两种情况下我看到Request.HttpMethod到Request.Form有其正确的价值观的要求。

现在的问题是,我怎么修复与Spring.NET的版本,以便它的工作原理就像使用统一框架呢?

有帮助吗?

解决方案

我已经找到了答案!

我的对象定义看起来像的是:

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

一切开始的工作就好了。

此致 马提亚。

其他提示

只是为了阐明此行为的附加注释:控制器是由ASP.NET MVC框架原型,但是弹簧默认为单模式处理。因此,你需要明确地标记你的对象为容器配置非单。即将推出的Spring MVC的集成模块会照顾这一点,这样你就不会遇到这个呢。

HTH, 埃里希

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top