Любой хороший ресурс, чтобы узнать об аспектно-ориентированном программировании без сторонних инструментов - PullRequest
0 голосов
/ 12 августа 2011

Я видел рост .NET с 1.0 до 4.0. Но есть один вопрос, который продолжает беспокоить меня. Как атрибуты в классе позволяют изменять определенное поведение объекта класса?

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

Я знаю, что есть некоторые сторонние инструменты, такие как замок или N-Hibernate для этой задачи, но как это было сделано в .NET изначально без его использования. Я хочу знать реальную сделку, заключающуюся в том, чтобы создать собственную настраиваемую логику для обработки атрибутов определенных объектов класса или его методов или свойств.

Любая помощь в правильном направлении приветствуется.

Спасибо. MB.

1 Ответ

0 голосов
/ 12 августа 2011

Хм, то, что вы спрашиваете, не обязательно связано с Аспектно-ориентированным программированием. Скорее всего, в средах AOP часто используются атрибуты для обозначения так называемых «pointcuts», т.е. места, где применяются «советы» (т. е. где тип будет изменен).

Обычно сами атрибуты не изменяют поведение класса; они только «помечают» тип для специального обращения чем-то другим, например, другим фреймворком, библиотекой, переписчиком байт-кода и т. д. ... или просто самим .NET.

  • Существуют некоторые специальные атрибуты, которые являются неотъемлемой частью .NET, которые «модифицируют» тип даже без необходимости использования какого-либо дополнительного инструмента & mdash; они будут рассматриваться по-разному в среде выполнения .NET. MarshalByRefObjectAttribute может быть одним из них. SerializableAttribute - еще одна важная часть .NET BCL, которая занимается сериализацией.

  • Конструктор Windows Forms для Visual Studio ищет определенные атрибуты, такие как Browsable, Description и т. Д.

  • WCF ищет атрибуты, такие как OperationContract, DataContract и т. Д.

Главное, что нужно понять, это то, что кто-то (даже если это сам .NET) должен активно проверять наличие атрибутов и что-то делать с ними; они ничего не делают сами! Это просто данные, аннотированные чем-то другим.

Вы можете написать свои собственные компоненты, которые берут объект и смотрят, есть ли у типа объекта определенные атрибуты (и если так, продолжайте другим способом). Это можно сделать с помощью отражения:

using System.Linq;
using System.Reflection;
…

public class SomeAttribute : Attribute { … }

void DoSomethingWith<T>(T someObject) // (T is only introduced here for
{                                     // easy reference in the comments below.)
    object[] attribute = 
          someObject.GetType().GetCustomAttributes(typeof(SomeAttribute), true);

    if (attribute.Any())
    {
        // [SomeAttribute] is present on type T, or T inherits the attribute.
    }
    else
    {
        // [SomeAttribute] is not present on T.
    }
}

См. Также документацию по MSDN: System.Type.GetCustomAttributes

...