Как заменить код котельной на атрибуты?

У нас есть этот шаблон повсюду в нашем коде:

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

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

Изменить: справится ли АОП?


person dgrant    schedule 05.02.2009    source источник
comment
Предложение using - это синтаксический сахар для блоков try ... finally. Вы запрашиваете ярлык для ярлыка, который сам по себе уже довольно короткий. Насколько короче было бы объявление атрибута? Стоит ли оно того? Разве «использование» уже не достаточно элегантно?   -  person Adam Ralph    schedule 05.02.2009


Ответы (4)


Взгляните на аспекты в spring.net.

person Logicalmind    schedule 05.02.2009
comment
Да, я бы хотел, чтобы наш проект использовал Spring.NET .... ‹sigh› К сожалению, это чистый .NET без зависимостей, и это не новый проект, поэтому уже слишком поздно вводить Spring.NET. Ну, если только не было действительно легко просто использовать часть aop. - person dgrant; 05.02.2009
comment
Вы все еще можете сделать это с помощью прокси. См. Это: castleproject.org/dynamicproxy/index.html - person Logicalmind; 05.02.2009

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

person Fredy Treboux    schedule 05.02.2009

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

person Joel Coehoorn    schedule 05.02.2009

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

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

DateTime serverTime;
context.UseService<IInfoService>(s=>serverTime = s.GetTime());
person flq    schedule 05.02.2009