2016-02-02 6 views
2

Я написал класс на C#, который реализует интерфейс PostSharp IAspectProvider. Я не понимаю, что я должен делать с этим сейчас, когда у меня есть это. Кажется, я не могу найти документацию на сайте PostSharp, которая подскажет мне, что делать с этим классом после его написания.Как подключить IAspectProvider, чтобы PostSharp использовал его?

PostSharp просто автоматически находит этот класс, потому что он получен из IAspectProvider и использует его? Или есть ссылка на страницу, которую я до сих пор не смог найти?

FWIW, класс представлен ниже. (MethodTracingAspect наш пользовательский аспект мы используем для обучения.)

namespace LoggingSample 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 

    using PostSharp.Aspects; 

    internal class ProviderAspect : IAspectProvider 
    { 
     public IEnumerable<AspectInstance> ProvideAspects(object targetElement) 
     { 
      var type = (Type) targetElement; 

      return type.GetMethods() 
         .Where(m => type.IsAssignableFrom(typeof(IReportBuilder)) 
            && m.IsPublic 
            && m.Name == "Execute") 
         .Select(m => new AspectInstance(targetElement, 
                 new MethodTracingAspect())); 
     } 
    } 
} 

ответ

1

Для PostSharp, класс, реализующий IAspectProvider является еще одним аспектом, и вы должны применить его к целевой элементы таким же образом, как и любой другой аспект. Таким образом, обычно ваш класс провайдера аспектов должен также выводиться из одного из классов атрибутов. Затем вы можете применить его как атрибут к целевому элементу, и этот элемент будет передан в метод ProvideAspects во время сборки.

В вашем конкретном примере вы можете получить из TypeLevelAspect, так как вы ожидаете, что ваш targetElement будет типом.

Пример поставщика аспекта доступен на этой странице документации: http://doc.postsharp.net/example-dataattributes

Пример использования аспекта:

// Aspect class 
[Serializable] 
public class ProviderAspect : TypeLevelAspect, IAspectProvider 
{ 
    public IEnumerable<AspectInstance> ProvideAspects(object targetElement) 
    { 
     // ... 
    } 
} 

// Apply to a single type 
[ProviderAspect] 
public class TargetClass : IReportBuilder 
{ 
    public void Execute() 
    { 
     // ... 
    } 
} 

// Apply to many types 
[assembly: ProviderAspect (AttributeTargetTypes="OurCompany.OurApplication.Reports.*")] 

Вы можете найти более подробную информацию о применении аспекта вашего кода на этой странице документации: http://doc.postsharp.net/applying-aspects

PS Мы также рассмотрим нашу страницу документации для поставщиков аспектов и добавим информацию об использовании.

+0

Я думаю, что я понимаю большую часть этого (так как в оригинальной статье я нашел состояния, в которых задействована какая-то умственная гимнастика). Тем не менее, я все еще не понимаю, что делать с классом после его написания. Связанный образец, который вы предоставили, по-прежнему предоставляет только реализацию 'IAspectProvider'. Должен ли этот аспект необходимо явно ссылаться на 'AssemblyInfo.cs'? Нужно ли мне украсить тип или два аспектом? Или PostSharp автоматически найдет поставщика во время компиляции и воспользуется им, потому что он происходит от 'IAspectProvider'? –

+0

Хорошо, я обновил ответ на примере. Извините, что первый ответ был не совсем ясен. – AlexD

+0

также вам не нужна assemblyinfo для обеспечения аспектов. Один пример - украсить класс аспектом IAspectProvider, и он также добавит аспекты также всем методам в классе (используя отражение). Вам просто нужна какая-либо точка входа в ваш код для ваших IAspectProviders для запуска – Batavia