Donnerstag, 15. Mai 2008

Inline C# for dummys...

Bei einer Transformation (BizTalkMapping (.btm)) in einem Bizalk Projekt, hat man die Möglichkeit mit Hilfe des "Scripting" Functioniden C# (oder besser "Inline C#") einzusetzen. Vielerorts sehr hilfreich, da man etwas speziellere Mappings damit schnell implementieren kann.

Beispiel:

   1:  public string ConvertStringToNumber(string strInput)
   2:  {
   3:      if(strInput.Equals("string1"))
   4:          return "1";
   5:      else  if(strInput.Equals("string2"))
   6:          return "2";
   7:   
   8:      return("0");
   9:  }

Benutzt man jetzt aber innerhalb EINER Transformation mehrere "Scripting" Functionide, gibt es eine Eigenart die einem eine schöne Zeit mit Fehlersuche bescherren kann, wenn man diese Eigenart nicht kennt.

Nehmen wir als Beispielt an, dass der Code von oben in unserem ersten Functionied eingebettet ist. Ziehen wir jetzt einen neuen "Scripting" Functionied in unsere Transformation rein und coden dort im "Inline C#" folgenden Code hinein:

   1:  public string ConvertStringToNumber(string strInput)
   2:  {
   3:      if(strInput.Equals("string3"))
   4:          return "3";
   5:      else  if(strInput.Equals("string4"))
   6:          return "4";
   7:   
   8:      return("5");
   9:  }

Wir sehen das Ergebniss soll beim ersten Functionied 0, 1 oder 2 und beim zweiten 3, 4 oder 5 sein. Gleich vorweg, es wird nicht korrekt funktionieren.

Der "Fehler" liegt einfach daran das intern die Methoden anhand des METHODENNAMEN nur ein mal angelegt werden. Und da unsere beiden "Inline C#" Methoden den gleichen Namen haben, wird in beiden Fällen die SELBE Methode benuzt (im Normalfall die zuerst angelegte). Das perfide daran ist, da es einfach KEINE Fehlermeldung beim Übersetzen oder Ausführen des Projektes gibt. Es läuft alles durch, es wird aber eben in beiden Fällen die selbe Methode aufgerufen.

Abhilfe schafft das unterschiedliche Vergeben des Methodennamens für die Methoden in den verschiedenen "Scripting" Functionieden. Also sollet unser zweites Codebeispiel so aussehen damit alles funktioniert:

   1:  public string ConvertAnotherStringToNumber(string strInput)
   2:  {
   3:      if(strInput.Equals("string3"))
   4:          return "3";
   5:      else  if(strInput.Equals("string4"))
   6:          return "4";
   7:   
   8:      return("5");
   9:  }

Keine Kommentare: