mboost-dp1

.NET AOP Static Weaver


Gå til bund
Gravatar #1 - arne_v
28. dec. 2011 03:30
Dem som interesserer sig for den slags (og det er nok en meget meget lille gruppe) har nok observeret at udvalget af sådanne tools er meget begrænset.

Jeg har selv brugt AspectDNG i mange år. Og det virkede perfekt. Men forfatteren droppede projektet i februar 2008 og det virker simpelthen ikke med nyere .NET versioner.

Så er der et helt nyt projekt SheepAspect/SheepAOP som ser meget lovende ud. Men jeg kan simplthen ikke få det til at virke. Intersserede kan selv forsøge at hente det fra CodePlex eller via NuGet.

¤"%!¤%!¤!

Man kan jo ikke leve uden AOP Static Weaver.

Så det er endt med at jeg har valgt at skrive min egen.

Resultatet kan ses her:

http://www.vajhoej.dk/arne/opensource/yaaopf/

Den mangler stadig lidt her og der, men der er da noget som virker.
Gravatar #2 - arne_v
28. dec. 2011 03:36
#1

Jeg skal lige tilføje at weavers der kræver attributter i input assembly ikke kan bruges til mine formål.

(bare inden nogen sidder og tænker - hvad med XYZ)
Gravatar #3 - arne_v
28. dec. 2011 03:39
#1

Og inden nogen tror at jeg bare er et megafjols siden jeg ikke kan få SheepAspect til at fungere, så se lige denne kode:

http://sheepaspect.codeplex.com/SourceControl/chan...


static int Main(string[] args)
{
try
{
//var configFile = args[0];
var configFile = @"D:\Dev\Experiment\TestSheepAspect\TestSheepAspect/bin/debug/SheepAspect.config";

var directoryPath = Path.GetDirectoryName(configFile);


Ikke helt production ready efter min mening!!
Gravatar #4 - Mort
28. dec. 2011 07:20
#1

Jeg vil lige tilføje at hvis det er intentionen at andre skal bruge det du har lavet, er det måske en god idé at forklare hvad det kan.
Gravatar #5 - Mort
28. dec. 2011 07:20
#4

Og så kan det måske være en god idé at lave et eksempel på hvordan man bruger det, så andre kan beslutte sig for om det er noget som er noget for dem.
Gravatar #6 - Mort
28. dec. 2011 07:22
#4

Derudover så kan det være en fordel at fortælle hvad det er det program du har lavet gør anderledes end de andre programmer du refererer til.
Gravatar #7 - Mnc
28. dec. 2011 09:01
#4,#5,#6
Derudover er der en glimrende "Ret indlæg" funktion, så man ikke unødigt smider 3 posts med svar til samme. :D

Dog er jeg enig i, at der godt kunne være en "Dette retter sig til 'disse' behov", idet der nævnes en specifik 'mangel'.

Evt. lave en liste over ting som programmet(?) ikke kan, som ellers ikke er helt unormale i 'miljøet'.

'Mangler' og 'ting som arnes ikke kan' bør ikke betragtes negativt, da jeg fint ved at hvis man ikke selv skal bruge det, så ryger det ikke i de tidligste releases. :)

* De mange citationstegn er ganske enkelt fordi, at jeg endnu en gang ikke kan følge med. :P
Gravatar #8 - Mort
28. dec. 2011 09:04
Mnc (7) skrev:
#4,#5,#6
Derudover er der en glimrende "Ret indlæg" funktion, så man ikke unødigt smider 3 posts med svar til samme. :D


Det var med fuldt overlæg en hyldest til arne_v's måde at svare på egne indlæg på :)
Gravatar #9 - Mnc
28. dec. 2011 09:17
Ja jeg tænkte det fandme nok. :|
Havde godt overvejet det, men gik alligevel imod min bedre overbevisning. :(

Du fortjener en Informativ. :P
Gravatar #10 - Windcape
28. dec. 2011 11:07
Jeg ville bruge PostSharp ( http://www.sharpcrafters.com/ ) hvis jeg skulle bruge mere AoP i .NET end jeg allerede gør.
Gravatar #11 - Windcape
28. dec. 2011 11:09
Mort (4) skrev:
Jeg vil lige tilføje at hvis det er intentionen at andre skal bruge det du har lavet, er det måske en god idé at forklare hvad det kan.
Det er AoP, det er hvad det kan :-) Arne har valgt at lade det matche AspectDNG, så du kan jo evt. læse Quickstart siden på http://aspectdng.tigris.org/nonav/doc/index.html
Gravatar #12 - arne_v
28. dec. 2011 16:00
Mort (4) skrev:
Jeg vil lige tilføje at hvis det er intentionen at andre skal bruge det du har lavet, er det måske en god idé at forklare hvad det kan.


Mort (5) skrev:
Og så kan det måske være en god idé at lave et eksempel på hvordan man bruger det, så andre kan beslutte sig for om det er noget som er noget for dem.


Overskriften fortæller faktisk hvad det er.

Hvis man altså ved hvad en AOP static weaver er for en tingest.

Hvis man ikke ved det er man naturligvis på bar bund.

Den ultra korte version kommer her:

AOP = Aspect Oriented Programming.

AOP er et supplement til OOP. OOP er god til at modellere business logic i. Men en masse praktiske programmering ting såsom logging, transaktions styring, caching, access control etc. passer dårligt ind i OOP modellen. Man ender typisk op med at gentage en masse kode i hundredevis af klasser og metoder. Ideen i AOP er at man definerer den slags separat og så væver dem ind i ens pæne OOP kode.

Man skelner mellem:
static weavers - som væver ved build
dynamic weavers - som væver runtime

ADVARSEL: man kan lave nogle meget elegante løsninger med AOP, men man kan altså også nemt gøre det umuligt at forstå flowet i ens applikation fordi den kode der udføres ikke er den samme som ens pæne business logic baserede OOP kode.
Gravatar #13 - arne_v
28. dec. 2011 16:02
Mort (6) skrev:
Derudover så kan det være en fordel at fortælle hvad det er det program du har lavet gør anderledes end de andre programmer du refererer til.


arne_v (1) skrev:
Jeg har selv brugt AspectDNG i mange år... og det virker simpelthen ikke med nyere .NET versioner.


arne_v (1) skrev:
Så er der et helt nyt projekt SheepAspect/SheepAOP ... Men jeg kan simplthen ikke få det til at virke.


Mit program virker.
Gravatar #14 - arne_v
28. dec. 2011 16:04
Mnc (7) skrev:
Evt. lave en liste over ting som programmet(?) ikke kan, som ellers ikke er helt unormale i 'miljøet'.


Mnc (7) skrev:
'Mangler' og 'ting som arnes ikke kan' bør ikke betragtes negativt, da jeg fint ved at hvis man ikke selv skal bruge det, så ryger det ikke i de tidligste releases.


ZIP filerne indeholder en meget kortfattet "Getting started" som indeholder en list over hvad der ikke er testet og derfor formentligt ikke virker. Og det er en rimelig lang liste!
Gravatar #15 - Windcape
28. dec. 2011 16:04
Forresten så kan weaving bruges til mange ting, f.eks. http://code.google.com/p/notifypropertyweaver/ , som er et *must have* ved alt UI programmering.

Men netop logging er altså en stærk feature ved AoP.
Gravatar #16 - arne_v
28. dec. 2011 16:08
Windcape (10) skrev:
Jeg ville bruge PostSharp ( http://www.sharpcrafters.com/ ) hvis jeg skulle bruge mere AoP i .NET end jeg allerede gør.


arne_v (2) skrev:

Jeg skal lige tilføje at weavers der kræver attributter i input assembly ikke kan bruges til mine formål.

(bare inden nogen sidder og tænker - hvad med XYZ)


PostSharp kræver mig bekendt attributter i input.

Der er to forskellige paradigmer:
- input definerer selv hvilke pointcuts de matcher
- pointcuts defineres udfra signaturer i aspects

Det første synes jg simpelthen ikke er godt nok.

Hvis man alligevel skal ind manuelt og tilføje attributter, så kunne man stort set lige så godt tilføje kode kald.

Man får først fuld udbytte af AOP hvis man kan definere pointcuts for signaturer med wildcard i sin aspects.
Gravatar #17 - arne_v
28. dec. 2011 16:09
Windcape (11) skrev:
Det er AoP, det er hvad det kan :-) Arne har valgt at lade det matche AspectDNG, så du kan jo evt. læse Quickstart siden på http://aspectdng.tigris.org/nonav/doc/index.html


Der er også et lille eksempel i "Getting started" i ZIP filerne.
Gravatar #18 - arne_v
28. dec. 2011 16:14
#15

Det burde faktisk kunne laves med et genrelt AOP framework også.

Men jeg kan dog se at jeg mangler at tilføje en lille ting i min kode generering for at jeg kan teste på om den nye værdi er forskellig fra den gamle værdi.
Gravatar #19 - arne_v
28. dec. 2011 16:16
#12

Læs evt.:

http://www.eksperten.dk/guide/1213 (Java og AspectJ)

http://www.eksperten.dk/guide/1214 (C# og AspectDNG)
Gravatar #20 - Windcape
28. dec. 2011 16:30
arne_v (16) skrev:
Man får først fuld udbytte af AOP hvis man kan definere pointcuts for signaturer med wildcard i sin aspects.
Problemet er bare at en string signatur ikke har nogen direkte relation til et stykke kode. Dvs. ved refactoring matcher ens signatur måske ikke længere.

Hvis man endelig skulle, tror jeg at jeg ville gå efter en slags builder, ala. Moq, hvor man kan definere strong-typed matches.

Dog kan jeg godt se at det muligvis ville give problemer med aspects på constructoren.




Gravatar #21 - arne_v
28. dec. 2011 16:31
Windcape (20) skrev:
Problemet er bare at en string signatur ikke har nogen direkte relation til et stykke kode. Dvs. ved refactoring matcher ens signatur måske ikke længere.


Det er klart en risiko.

Men at skulle definere aspects for lad os sige 1000 klasser med 10000 members gør altså wildcard meget attraktivt.
Gravatar #22 - Windcape
28. dec. 2011 16:33
Eksempel:


public class AspectsSample : AspectRunner
{
public override void Setup()
{
AroundCall<Sample>(x => x.Test(It.Any())).Intercept(jp =>
{
Console.WriteLine("Code before calls to '.. Sample.Test(..)'");
object result = jp.Proceed();
Console.WriteLine("Code after calls to '.. Sample.Test(..)'");
return result;
});

AroundBody<Sample>(x => x.Test(It.Any())).Intercept(jp =>
{
Console.WriteLine("Code before body of '.. Sample.Test(..)'");
object result = jp.Proceed();
Console.WriteLine("Code after body of '.. Sample.Test(..)'");
return result;
});
}
}
Gravatar #23 - Windcape
28. dec. 2011 16:34
I det overstående eksempel ville man

a) være sikker på at man matcher den/de rigtige overloads
b) have refactoring support på metode og klassenavnet

Gravatar #24 - arne_v
1. jan. 2012 23:50
Jeg har lige smidt en version 1.1 op:


1.1
Add:
Instance, SkipCall and Context properties in MethodJoinpoint
Improve wildcard support to allow arbitrary usage of *
Support generic data types as arguments and return type
Support at AtExceptionAdvice


Desværre kan jeg konstatere at advices på metoder som selv er generiske ikke virker. Ved ændring af IL koden bliver resultatet invalid.
Gravatar #25 - Windcape
2. jan. 2012 03:53
#24

Du er for gammeldaws til at bruge GitHub eller lign. siden du bare smider det op som en zip fil ?-)
Gravatar #26 - arne_v
2. jan. 2012 15:00
#25

Ja.

Jeg foretrækker at have mit repository inhouse.

Og jeg kører SVN.

Og den eneste grund til at jeg ikke længere kører CVS er at CVSNT gik i hundene.

Jeg har stadig kode i RCS!

(RCS er CVS's forgænger)
Gravatar #27 - Windcape
2. jan. 2012 15:02
arne_v (26) skrev:
Jeg foretrækker at have mit repository inhouse.
Det er det jo principelt også, hvis du kørte DVCS, da online udgaven ville være et mirror, og ikke der hvor man har hele versionshistorien.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login