Атрибутите се използват вътрешно от .NET Framework за различни цели – при сериализация на данни, за описание на различни характеристики, свързани със сигурността на кода, за задаване на ограничения за оптимизациите от JIT компилатора, така че кодът да може да се дебъгва, за взаимодействие с дизайнера на средата за разработка при създаване на .NET компоненти, при взаимодействие с неуправляван код, при работа с уеб услуги, в ASP.NET потребителски контроли и на много други места.
Ще разгледаме някои от най-важните приложения на атрибутите вътрешно в .NET Framework.
Декларативно управление на сигурността
.NET Framework дава възможност на разработчиците да поставят ограничения върху сигурността в два стила. Императивният стил е свързан със създаването на Permission обекти по време на изпълнение и извършване на обръщения към техните методи. Декларативният се осъществява чрез атрибути. Следва пример за декларативно управление на сигурността чрез атрибути:
[PrincipalPermissionAttribute(SecurityAction.Demand,
Name = "SomeUser", Role = "Administrator")]
public void DeleteCustomer(string aCustomerId)
{
// Delete the customer
}
|
В горния пример чрез атрибута PrincipalPermissionAttribute се указва на CLR, че за изпълнението на метода DeleteCustomer(…) е необходимо текущата нишка да се изпълнява от потребител SomeUser, който е в роля Administrator.
В темата "Сигурност в .NET Framework" ще се спрем в детайли върху императивното и декларативното управление на сигурността.
Сериализацията е процес на конвертиране на обект или свързан граф от обекти в поток от байтове. Десериализацията представлява обратния процес. В .NET Framework сериализацията и десериализацията се извършват автоматично от CLR, но за да се укаже, че даден обект подлежи на сериализация, се използват атрибути. Ето един пример:
[Serializable]
public struct User
{
private string mLogin;
private string mPassword;
private string mRealName;
// ...
}
|
В примера чрез атрибута SerializableAttribute се указва на CLR, че структурата User може да се сериализира по стандартния за CLR начин.
Сериализацията в .NET Framework ще разгледаме по-детайлно в темата за сериализация на данни.
Компонентен модел на .NET
При проектирането на .NET платформата е залегнал принципът за компонентно-ориентираното програмиране. .NET Framework дефинира компонентен модел, който установява стандарти за разработване и използване на компоненти. При разработване на .NET компоненти чрез атрибути към тях може да се дефинират метаданни, които се използват от Visual Studio .NET по време на дизайн. Ето един пример, в който чрез атрибут се указва категорията, в която да се появи свойството BorderColor в панела за настройка на свойствата за даден компонент:
public class SomeComponent : Control
{
// ...
[Category("Appearance")]
public Color BorderColor
{
get { … }
set { … }
}
// ...
}
|
На компонентния модел на .NET Framework ще обърнем по-специално внимание в темата за Windows Forms.
Създаване на уеб услуги в ASP.NET
.NET Framework има вградена поддръжка на уеб услуги. Уеб услугите служат за обмяна на информация между отдалечени приложения посредством стандартни протоколи. За управление на поведението на уеб услугите в ASP.NET се използват атрибути. Ето един пример, в който чрез атрибута [WebMethod] се указва, че даден метод е публично достъпен като част от дадена уеб услуга:
public class AddService : WebService
{
[WebMethod]
public int Add(int a, int b)
{
return a + b;
}
}
|
На уеб услугите в ASP.NET ще обърнем специално внимание в темата за уеб услуги.
Взаимодействие с неуправляван (Win32) код
.NET Framework може да взаимодейства с неуправляван Win32 код: да извиква Win32 функции, да използва COM компоненти и да публикува COM компоненти. За настройка на различни параметри на взаимодействието с неуправляван код се използват атрибути. Един от тях е системният атрибут DllImport. Нека разгледаме следния пример на декларация на външна Win32 функция:
[DllImport("user32.dll", EntryPoint="MessageBox")]
public static extern int ShowMessageBox(int hWnd, string text,
string caption, int type);
|
В примерния код чрез DllImport се указва, че статичният метод ShowMessageBox(…) е външна неуправлявана функция с име MessageBox от Win32 библиотеката user32.dll.
Ще обърнем специално внимание на атрибутите за връзка с неуправляван код в темата "Взаимодействие с неуправляван код".
Синхронизация при многонишкови приложения
.NET Framework използва вътрешно някои атрибути, за да осигури синхронизация при конкурентен достъп до даден метод от няколко нишки. Ето един пример, при който чрез специален атрибут (System.Runtime. CompilerServices.MethodImplAttribute) се указва, че методът SomeMethod() може да бъде изпълняван от най-много една нишка в даден момент:
[MethodImplAttribute (MethodImplOptions.Synchronized)]
public void SomeMethod() { ... }
|
Сподели с приятели: |