Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs
ASP German Homepage Homepage
 

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Transaktionen in C# Business Tier Komponenten

Geschrieben von: Christoph Wille
Kategorie: C#

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.

Erstellen der Komponente

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.

Die Komponente aufrufen

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...

Schlußbemerkung

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.

Download des Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

Einführung: C#-Klassen in ASP.NET
In VB Komponenten auf ASP Objekte zugreifen (Variante 2)
Verwenden von COM Komponenten in ASP.NET

Links zu anderen Sites

DotNetGerman Diskussionslisten

Wenn Sie jetzt Fragen haben...

Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten.

Eine weitere sehr hilfreiche Resource ist das deutsche ASP.NET Wiki, das als zentrale Anlaufstelle für Tips, Tricks, Know How und alles Nützliche was man in seinem Alltag als (ASP).NET-Entwickler so braucht und entdeckt gedacht ist.

Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.

 

Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©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.