ASP.NET MVC、Spring.NET和NHibernate的初始设置/示例/教程

7
你是否在进行涉及Spring.NET和NHibernate的ASP.NET MVC开发?我希望看到这样一个信息丰富的示例,以便能够基于此构建自己的项目。
我尝试了谷歌搜索,找到了一些很好的东西,比如S#arp Architecture,一篇关于常规ASP.NET(WebForms)与框架集成等的文章。尽管如此,我仍然缺少一个关于ASP.NET MVC和这个主题的好教程。
附言:我知道Spring和Hibernate如何工作,我只是需要将它们插入MVC应用程序中。现在不想使用S#arp Architecture。
附言:我会更新链接,包括这个链接:

顺便问一下,我想知道 S#arp Architecture 是否可以默认使用其他 DI 容器,比如改用 Spring.NET :) - Bubba88
为什么不呢,IoC容器不是S#arp的主要部分。它在许多地方使用ServiceLocator,所以您只需要更改组件注册即可。 - queen3
4个回答

5
NHibernate配置与Spring.Net webforms应用程序相同。在web.config中添加OpenSessionInView模块,并在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,但它不配置 action filters。它在应用程序启动时进行配置:

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

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

1

1

我也曾经苦于找不到一个NHibernate、Spring.NET和ASP.NET MVC的例子。我找到了Spring.NET/NHibernate Northwind的例子(使用WebForms模式),但是找不到一种简单的方法来使用NHibernate DAO与我的模型。

最后,我找到了这个,发现它非常有帮助。


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工作(通常使用Spring的WebSupportModule)。

b)有一些文章考虑了所需的集成,但它们似乎都有某种程度的原始性(也许是因为其中许多只提供了不起作用的解决方案?:))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接