Geschrieben von: Christoph Wille
Kategorie: C#
This printed page brought to you by AlphaSierraPapa
Im Laufe der Zeit hat man sich ja sozusagen die COM+ Applikationen (aka MTS Packages) angewöhnt, und zwar einerseits als Object Broker, und andererseits als Provider von Transaktionen über Komponentengrenzen hinweg. Heute werde ich zeigen, daß das erworbene Wissen auch in .NET verwendbar ist - und die Anwendung sogar deutlich leichter geworden ist!
Um den heute vorgestellten Code verwenden zu können, muß am Rechner das Microsoft .NET SDK installiert sein.
Eine lästige Tätigkeit bei der Verwendung von COM+ Applikationen war ja, daß man die Applikation händisch anlegen und jede einzelne Komponente mit ihren Transaktionsattributen dort registrieren mußte. Damit komme ich zur besonders guten Nachricht des Tages: in .NET fällt das weg, die Komponenten registrieren sich selbständig - man muß nur Attribute in der Komponente setzen, den Rest erledigt .NET!
Eine Änderung zu COM+ muß man aber beachten: es gibt in .NET keine GUID's zur eindeutigen Komponentenidentifizierung mehr, diesen Platz nimmt das Konzept der Strong Names ein. Grundsätzlich handelt es sich dabei um nichts anderes als einen kryptographischen Fingerprint der Komponente, der absolut eindeutig ist. Allerdings um der Kryptographie genüge zu tun, muß man sich ein Keyfile anlegen, und zwar mit Hilfe des sn.exe Utility's:
sn -k MyComponent.snk
Im Normalfall wird das generierte Keyfile "weggesperrt", weil damit die Echtheit der Komponente bescheinigt wird. Aber in unserem ersten einfachen Beispiel lassen wir das generierte Keyfile im Projektverzeichnis "herumliegen". Es ist einfach einfacher.
Schauen wir uns nun an, wie die Komponente dieses Keyfile verwendet (complusservices.cs):
using System; using System.EnterpriseServices; using System.Reflection; // This is the name that will appear in the COM+ catalog [assembly: ApplicationName("MyComponent")] // Strong name for assembly. [assembly: AssemblyKeyFile("MyComponent.snk")] namespace AspHeute { //... to be continued
Das Keyfile wird im AssemblyKeyFile Attribut angegeben - und das war auch schon alles. Den Rest übernimmt der Compiler für uns. Also keine große Sache, muß aber für jede in COM+ eingebundene .NET Komponente gemacht werden.
Das ApplicationName Attribut ist unser Gratisticket zur Installation als COM+ Application - unter diesem Namen wird nach dem ersten Aufruf unsere Komponente registriert sein - cool, nicht wahr?
Der System.Reflection Namespace ist für das AssemblyKeyFile Attribut inkludiert, der System.EnterpriseServices Namespace hingegen dient der Komponente selbst:
[Transaction(TransactionOption.Required)] public class MyClass : ServicedComponent { [AutoComplete] public String TransactedMethod(int amount) { return "A-OK"; } public void VoteOK() { ContextUtil.SetComplete(); } public void VoteNo() { ContextUtil.SetAbort(); } }
Wieder einmal sind die Attribute unsere Eintrittskarte zu COM+. Mit Transaction gibt man an, daß die folgende von ServicedComponent abgeleitete Komponente in COM+ arbeiten wird - und zwar mit einem der entsprechenden Transaktionsattribute: Disabled, NotSupported, Required, RequiresNew oder Supported. Nun sind alle Infrastruktur-Tasks erfüllt, der Rest ist dann der tatsächliche Code der Businesskomponente.
Ich habe drei einfache Methoden eingebaut: TransactedMethod, VoteOK und VoteNo. Die letzten beiden funktionieren nach dem bekannten Prinzip explizit zum Ausgang einer Transaktion zu voten, und zwar entweder mit SetComplete oder SetAbort. Interessanter weil neu ist hingegen das Attribut AutoComplete - was bedeutet das? Nun, einfaches und bequemes programmieren: tritt eine Exception auf, voted die Methode mit SetAbort - läuft der Code OK ab, votet sie automatisch mit SetComplete. Bequem, nicht wahr?
Damit hätten wir eine voll funktionsfähige Komponente fertig. Sie muß nur noch kompiliert werden. Der Faulheit halber habe ich SharpDevelop verwendet, aber wer es gerne selbst macht: man braucht die Reference für System.EnterpriseServices, der Rest kommt automatisch mit.
Wer jetzt schon in Component Services nachgesehen hat, wird bemerkt haben, daß die Komponente dort noch nicht aufscheint. Dies passiert erst, wenn man sie das erste Mal aufruft. Deshalb schreiben wir uns ein kleines Kommandozeilenprogramm (Main.cs), eine ASP.NET Seite folgt danach:
using System; using AspHeute; class MainClass { public static void Main(string[] args) { MyClass var = new MyClass(); Console.WriteLine(var.TransactedMethod(10)); } }
Dieses Programm mit unserer Komponente als Reference kompiliert, und schon haben wir eine kleine (nutzlose) Clientapplikation. Aber: nach dem ersten Ausführen ist die Komponente in COM+ registriert:
Und funktioniert hat sie auch beim ersten Mal (nur langsam, wegen der Registrierung). Alle weiteren Aufrufe sind ab nun enorm schnell, und ja, wir können mit Transaktionen arbeiten. Es war wirklich so einfach!
Nun aber zum ASP.NET Beispiel, das so anders eigentlich nicht ist (tactedinaspnet.aspx):
<% @Page Language="C#" %> <% @Assembly Name="System.EnterpriseServices" %> <% @Import Namespace="System.EnterpriseServices" %> <% @Import Namespace="AspHeute" %> <% MyClass var = new MyClass(); string strResult = var.TransactedMethod(10); Response.Write(strResult); %>
Nur den System.EnterpriseServices Namespace mußte ich extra angeben, da ASP.NET Pages selbst zu Assemblies kompiliert werden (und dadurch sonst die Reference fehlen würde). Ach ja - das bin Verzeichnis ist ein guter Ort zur "Aufbewahrung" der Komponente, außer man registriert die Komponentenassembly (korrekterweise) im GAC - dem Global Assembly Cache. Aber das ist ein andere Geschichte...
Der heutige Artikel war ein Schnellstkurs zur Komponentenerstellung in C#, und deren Integration in COM+ Applications. Die Botschaft des Artikels soll sein, daß es niemals leichter war Business Komponenten mit Transaktionen zu erstellen als unter .NET - und man diese Gelegenheit ergreifen sollte.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010619.zip
Einführung: C#-Klassen in ASP.NET
http:/www.aspheute.com/artikel/20001012.htm
In VB Komponenten auf ASP Objekte zugreifen (Variante 2)
http:/www.aspheute.com/artikel/20010322.htm
Verwenden von COM Komponenten in ASP.NET
http:/www.aspheute.com/artikel/20000828.htm
DotNetGerman Diskussionslisten
http://www.dotnetgerman.com/
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.