ASP.NET MVC,Spring.NET,NHibernate初始设置/示例/教程

时间:2010-03-11 15:05:57

标签: .net asp.net-mvc nhibernate spring.net

你是否一直在做一些涉及Spring.NET和NHibernate的ASP.NET MVC开发?我想看一个这样设置的信息性示例,所以我可以建立我自己的项目。

我尝试使用谷歌搜索,发现了一些漂亮的东西,如S#arp Architecture,一篇关于与框架集成的常规ASP.NET(WebForms)的文章等等。不过,我错过了关于ASP.NET MVC& amp;的一个很好的教程。主题

P.S。:我知道Spring和Hibernate是如何工作的,我只需要将它们插入到MVC应用程序中。现在不想使用S#arp架构。

P.P.S:我稍后会更新这些链接,包括这个链接:

4 个答案:

答案 0 :(得分:5)

NHibernate配置与Spring.Net webforms应用程序没有什么不同。将OpenSessionInView模块添加到web.config并在spring配置中定义名为SessionFactory的会话工厂。

通过在应用程序启动中注册自定义IControllerFactory来完成Spring.Net和MVC集成,这将应用自定义ControllerActionInvoker。控制器工厂创建或配置控制器,动作调用器配置任何ActionFilter

public class MvcApplication: System.Web.HttpApplication
{
    public static void RegisterRoutes( RouteCollection routes )
    {
        //
    }

    protected void Application_Start()
    {
        RegisterRoutes( RouteTable.Routes );

        lock (this) {
            ControllerBuilder.Current.SetControllerFactory( new SpringControllerFactory() );
        }
    }
}

public class SpringControllerFactory: DefaultControllerFactory
{
    public SpringControllerFactory()
    {
        SpringContext = WebApplicationContext.Current;
    }
    protected override IController GetControllerInstance( Type controllerType )
    {
        IController controller = null;
        if (SpringContext.ContainsObject( controllerType.Name )) {
            controller = (IController) SpringContext.GetObject( controllerType.Name );
        }

        if (controller == null) {
            controller = base.GetControllerInstance( controllerType );
            SpringContext.ConfigureObject( controller, controllerType.FullName );
        }

        var standardController = controller as Controller;
        if (standardController != null) {
            standardController.ActionInvoker = new SpringActionInvoker();
        }

        return controller;
    }

    private IApplicationContext SpringContext
    { get; set; }
}

public class SpringActionInvoker: ControllerActionInvoker
{
    public SpringActionInvoker()
    {
        SpringContext = WebApplicationContext.Current;
    }
    protected override FilterInfo GetFilters( ControllerContext controllerContext, ActionDescriptor actionDescriptor )
    {
        var filterInfo = base.GetFilters( controllerContext, actionDescriptor );

        foreach (IActionFilter filter in filterInfo.ActionFilters.Where( f => f != null )) {
            SpringContext.ConfigureObject( filter, filter.GetType().FullName );
        }

        foreach (IAuthorizationFilter filter in filterInfo.AuthorizationFilters.Where( f => f != null )) {
            SpringContext.ConfigureObject( filter, filter.GetType().FullName );
        }

        foreach (IExceptionFilter filter in filterInfo.ExceptionFilters.Where( f => f != null )) {
            SpringContext.ConfigureObject( filter, filter.GetType().FullName );
        }

        foreach (IResultFilter filter in filterInfo.ResultFilters.Where( f => f != null )) {
            SpringContext.ConfigureObject( filter, filter.GetType().FullName );
        }

        return filterInfo;
    }

    private IApplicationContext SpringContext
    { get; set; }
}

Mvc Contrib有一个类似的SpringControllerFactory,但它没有配置动作过滤器。它在应用程序启动时配置:

    protected void Application_Start()
    {
        RegisterRoutes( RouteTable.Routes );

        lock (this) {
            ControllerBuilder.Current.SetControllerFactory( new SpringControllerFactory() );
            SpringControllerFactory.Configure( WebApplicationContext.Current );
        }
    }

答案 1 :(得分:1)

对于nhibernate,请查看Stephen Bohlen的网络广播Summer of NhibernateAutumn of Agile

就我个人而言,我还没有使用过Sprint.net,但我发现screencast对于获得一般性概述非常有用。弗雷德里克诺曼也有asp.net MVC and spring.net的帖子。

答案 2 :(得分:1)

我也很难找到NHibernate,Spring.NET和ASP.NET MVC示例。我找到了Spring.NET/NHibernate Northwind示例(使用WebForms模式),但找不到一种简单的方法来将NHibernate DAO用于我的模型。

最后,我发现this one并发现它非常有帮助。

答案 3 :(得分:0)

我终于设法为我的ASP.NET MVC应用程序提供Spring.NET工具。刚写了一个自定义控制器工厂(简单化),然后,给定一个全局Spring上下文(我手动创建),我可以拔出我的控制器并做我以前做的任何事情。

一些有用的链接,但不是全部: http://www.pnpguidance.net/Post/SetDefaultControllerFactoryIControllerFactoryASPNETMVCFramework.aspx

http://weblogs.asp.net/seanmcalinden/archive/2010/01/13/custom-ioc-container-for-dependency-injection-with-an-asp-net-mvc-website-usage-example.aspx

从那时起,与NHibernate的集成必须非常简单:)

P.S。:问题是:a)MVCContrib现在似乎否认需要IoC容器,因为我听说过ASP MVCContrib中有关IoC / DI弃用的内容。我想,这就是为什么我无法让他们的SpringControllerFactory工作(像往常一样的WebSupportModule的春天)

b)有一些文章,考虑到所需的整合,但它们似乎都是......在某种意义上是原始的(也许是因为许多只提供不起作用的解决方案?:))