NHibernate配置与Spring.Net webforms应用程序没有什么不同。将OpenSessionInView
模块添加到web.config
,并在spring配置中定义一个名为SessionFactory
的会话工厂。
Spring.Net和MVC集成通过在应用程序启动时注册自定义IControllerFactory
完成,这适用于自定义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);
}
}
顺便说一句,我不知道是否S#arp架构默认使用其他DI可以更改为使用Spring.NET :) – Bubba88 2010-03-11 15:13:10
为什么不,IoC容器不是S#arp的主要部分。它在许多地方使用ServiceLocator,因此您只需更改组件注册。 – queen3 2010-03-11 17:12:54