我尝试了谷歌搜索,找到了一些很好的东西,比如S#arp Architecture,一篇关于常规ASP.NET(WebForms)与框架集成等的文章。尽管如此,我仍然缺少一个关于ASP.NET MVC和这个主题的好教程。
附言:我知道Spring和Hibernate如何工作,我只是需要将它们插入MVC应用程序中。现在不想使用S#arp Architecture。
附言:我会更新链接,包括这个链接:
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 );
}
}
关于nhibernate,可以看看Stephen Bohlen的网络研讨会Summer of Nhibernate和Autumn of Agile。
个人没有使用过Sprint.net,但我发现这个screencast对于获得一般概述很有用。Fredrik normen也在asp.net MVC and spring.net上发表了一篇文章。
我也曾经苦于找不到一个NHibernate、Spring.NET和ASP.NET MVC的例子。我找到了Spring.NET/NHibernate Northwind的例子(使用WebForms模式),但是找不到一种简单的方法来使用NHibernate DAO与我的模型。
最后,我找到了这个,发现它非常有帮助。
从那时起,与NHibernate的集成应该非常简单 :)
P.S.:问题是:a)MVCContrib现在似乎否认了对IoC容器的需求,因为我听说ASP MVCContrib中的IoC/DI已经被弃用。我猜这就是为什么我无法让他们的SpringControllerFactory
工作(通常使用Spring的WebSupportModule
)。
b)有一些文章考虑了所需的集成,但它们似乎都有某种程度的原始性(也许是因为其中许多只提供了不起作用的解决方案?:))