@Transactional в сервисном слое в ASP.NET MVC - PullRequest
2 голосов
/ 20 июня 2011

Работая с Spring MVC для JAVA, я привык к тому, что поведение @Transactional применяется на сервисном уровне, который великолепно работает с Dibers Hibernate. Теперь, когда я столкнулся с аналогичной проблемой в проекте, основанном на LINQ to SQL ORM, я вижу, что все транзакции происходят в DAO (то есть с использованием (DC dc = new DC () {dc.submitChanges ()}

Как удалить логику транзакций из DAO и перенести ее на уровень обслуживания в проекте ASP.NET MVC LINQ2SQL?

Спасибо.

1 Ответ

2 голосов
/ 20 июня 2011

Это сработало невероятно, потому что Spring MVC зарегистрировал в Hibernate Session и SessionFactory и занимался созданием и совершением транзакций.Вы можете сделать это и в .NET, но вы должны сделать это сами.Не существует готовой интеграции всех этих инструментов, которые Spring MVC предоставляет для Java.Обычно вам нужно внедрить DataContext экземпляр в сервисный уровень вместо того, чтобы создавать его вручную.

Что вы называете сервисным уровнем?Для меня сервисный уровень - это модель.В этом случае материал в основном находится за пределами ASP.NET MVC - существует способ создания атрибута для действия контроллера в ASP.NET MVC ( пользовательские фильтры ), но это не сервисный уровень.Если вам нужен настраиваемый транзакционный атрибут для сервисного уровня, это в основном означает Аспектно-ориентированное программирование (AOP).

Каков ваш выбор?Выберите хороший контейнер IoC, который поддерживает AOP - например, Windsor Castle, Spring.NET, Unity 2.0 или используйте PostSharp для AOP.Самый простой способ создать транзакционный атрибут AOP - это просто создать TransactionScope перед выполнением аннотированного метода и Complete область действия после выполнения аннотированного метода.Но это не то, что вы хотите, потому что вам все равно придется создать DataContext экземпляр и вызвать SubmitChanges.Вам нужен атрибут AOP, который создаст экземпляр DataContext, сохранит его где-нибудь и выполнит аннотированный метод.Метод сможет загрузить сохраненный экземпляр контекста и использовать его.Как только метод завершится, атрибут AOP вызовет SubmitChanges.Единственная проблема заключается в том, где хранить экземпляр контекста и как его получить - я полагаю, что Spring MVC использует Spring для этого внутренне и обеспечивает всю инфраструктуру, но в .NET вам придется написать его - в случае веб-приложения.вам придется хранить контекст в HttpContext.Items.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...