2016-02-21 7 views
0

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

void mymethod() 
{ 
    LogUtility.EnteringMethod(); 
    //dowork 
    LogUtility.EXitingMethod(); 
} 

I хотел бы преобразовать выше, чтобы быть просто

void mymethod() 
{ 
    //dowork 
} 

Но при компиляции/сборки во времени, я хотел бы макрос/скрипт для добавления этих LogUtility линии в каждом из моих методов.

Я знаю, что есть аспектно-ориентированное программирование, но я ищу что-то значительно менее сложное и неуклюжее.

Можете ли вы рекомендовать способ автоматического генерации кода перед компиляцией/сборкой?

+0

Вы ищете PostSharp. – SLaks

+0

Если вы ищете более старый подход к школе - «регистрация в качестве сквозной проблемы с инъекцией зависимостей» может быть хорошим поисковым термином (не очень близким к тому, что вы имеете в виду, но добивается аналогичной цели) I.e. http://stackoverflow.com/questions/7905110/logging-aspect-oriented-programming-and-dependency-injection-trying-to-make. –

+0

Взгляните на рамки, например [Fody (бесплатно)] (https://github.com/Fody/Anotar) или [PostSharp (коммерческий)] (https://www.postsharp.net/diagnostics/net-logging), которые обеспечивают эту функциональность, применяя компиляцию во времени. –

ответ

1

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

Это тот же движок, что и Entity Framework и MVC для генерации C# после интерпретации ваших моделей и т. Д.

Если вы хотите получить официальную документацию о том, как это работает с Microsoft, вы также можете прочитать здесь Code Generation and T4 Text Templates, Design-Time Code Generation by using T4 Text Templates.

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

Если вы не хотите, чтобы у вас возникли проблемы с этим, вы можете использовать Post Sharp, как указал Райджа Надар в своем ответе.

Надеюсь, это даст вам место для начала.

0

Если вы хотите автоматический путь, то система AOP, такая как PostSharp, в значительной степени является самым чистым вариантом. Вы можете попытаться автоматизировать ее самостоятельно с помощью отражений и атрибутов и манипуляций с ИЛ, но это не тривиально.

, и если вы хотите действительно упростить и не использовать 100% -ную автоматизацию, вы можете использовать метод-обертку с параметром Action. это действительно не масштабируемое решение и довольно уродливое с точки зрения удобочитаемости кода.

public void RunMethodWithEntryAndExitLogging(Action methodToExecute) 
{ 
    LogUtility.EnteringMethod(); // use methodToExecute.Method.Name if you need it 

    methodToExecute(); // the method that is the actual work 

    LogUtility.EXitingMethod(); 
} 

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