Вы делали некоторый ASP.NET разработка MVC, включающая Spring.NET и NHibernate оба? Я хотел бы видеть информативный пример такой установки, таким образом, я мог разработать свой собственный проект от этого.
Я пытался гуглить, нашел некоторые симпатичные вещи как Архитектура S#arp, изделие об обычном ASP.NET (Веб-формы) интегрированный с платформами и так далее. Однако, я пропускаю хорошее учебное руководство на ASP.NET MVC и тема.
P.S.: Я действительно знаю, как Spring и В спящем режиме работы, я просто должен включить их в приложение MVC. Не хочу использовать Архитектуру S#arp к настоящему времени.
P.P.S: я обновлю ссылки позже, включая этого:
Наконец-то мне удалось снабдить мое приложение ASP.NET MVC средствами Spring.NET. Просто написал настраиваемую фабрику контроллеров (достаточно упрощенную), а затем, учитывая глобальный контекст Spring (который я создаю вручную), я могу просто вытащить свои контроллеры и сделать то, что я делал раньше.
Некоторые полезные ссылки, но не все: http://www.pnpguidance.net/Post/SetDefaultControllerFactoryIControllerFactoryASPNETMVCFramework.aspx
С тех пор интеграция с NHibernate должна быть довольно простой: )
PS: Проблема в следующем: a) MVCContrib, похоже, сейчас отрицает необходимость в контейнерах IoC, потому что я слышал что-то об устаревании IoC / DI в ASP MVCContrib. Думаю, именно поэтому мне не удалось заставить их SpringControllerFactory
работать (как обычно с WebSupportModule
Spring)
б) Есть несколько статей, касающихся необходимой интеграции, но все они кажутся ... в некотором смысле сырыми (возможно, потому, что многие из них просто предоставляют решения, которые не работают? :))
Конфигурация NHibernate ничем не отличается от приложения веб-форм Spring.Net. Добавьте модуль OpenSessionInView
в web.config
и определите фабрику сеансов с именем SessionFactory
в конфигурации spring.
Интеграция 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 );
}
}
Для nhibernate посмотрите вебкасты Стивена Болена Summer of Nhibernate и Autumn of Agile.
Лично я не использовал Sprint.net, но этот скринкаст показался мне полезным для получения общего представления. У Фредрика Нормена также есть пост о asp.net MVC и spring.net.