2009-02-05 3 views
1

У нас есть этот шаблон везде в нашем коде:Как заменить код котельной с атрибутами?

using (ServiceAccess ws = new ServiceAccess()) 
{ 
//... 
//code here to talk to webservice ws 
//... 
} 

Как я могу заменить эту котельную код пластины с атрибутом на функции, которые должны поговорить с веб-сервиса? (Я вспоминаю, когда некоторое время назад я делал некоторые вещи с Hibernate в Java, и появилась аннотация «Транзакция», которую вы могли бы использовать, чтобы автоматически вставить некоторые попытки ... уловить код котельной пластины в функцию .) Использование {} уже довольно хорошо, но было бы неплохо не иметь его вообще ... Наличие атрибута также помогло бы документировать функцию как та, которая говорит о веб-службе, а не о том, что делает.

Редактировать: Будет ли AOP делать трюк?

+0

Предложение «использование» - это синтаксический сахар для попыток ... наконец-то блоков. Вы запрашиваете ярлык для ярлыка, который уже довольно короткий. Насколько короче будет объявление атрибута? Стоит ли оно того? Не слишком ли «используется» достаточно элегантно? –

ответ

0

Я думаю, что лучшее, что вы можете сделать, это создать ярлык для вставки этого кода в виде фрагмента. Вы не можете разрезать объявление переменной в метод с помощью атрибута. Или иначе, атрибуты могут только рассказать вам о коде. Они не могут изменить сам код.

1

Посмотрите на aspects весной.net.

+0

Да, я хочу, чтобы наш проект использовал Spring.NET .... К сожалению, это чистая .NET без каких-либо зависимостей, и это не новый проект, поэтому слишком поздно приносить Spring.NET. Хорошо, если просто было просто просто использовать часть AOP. – dgrant

+0

Вы все еще можете сделать это с помощью прокси. См. Это: http://www.castleproject.org/dynamicproxy/index.html – Logicalmind

1

Вы также можете посмотреть PostSharp. Я дам вам использовать атрибуты для реализации аспектов, вы можете использовать его для достижения того, чего хотите.

0

вещи типа «Аспект» ... это способ украсить данный метод кодом по вашему выбору. Если вы хотите удалить, например, после вызова вашего метода, аспект, а также код должны иметь доступ к Сервису. Это также означает, что вы мало контролируете срок службы класса обслуживания.

В некотором коде в последнее время я предоставляю контекст своему классу, через который могут быть получены экземпляры службы. Они предоставляются делегату, которого вы можете передать. Любое удаление может быть сделано после того, как ваше закрытие осталось ...

DateTime serverTime; 
context.UseService<IInfoService>(s=>serverTime = s.GetTime());