.NET Blog   ·   .NET Casts   ·   .NET GUI Foren   ·   .NET BlogBook   ·   WPF Blogger   ·   visual studio one   ·   ASP.NET professional

  • ACHTUNG - NEUES BLOG

    Ab sofort steht unter http://devtyr.norberteder.com mein neues Blog zur Verfügung. Dieses Blog wird nicht weiter betreut, bleibt aber erhalten. Neue Eintr%auml;ge erfolgen nur mehr im neuen Blog. Kommentare werden ebenfalls nicht mehr behandelt. Wer weiterhin meinen Einträgen und Aktivitäten folgen möchte, möge bitte RSS-Feeds, Verlinkungen etc. an die neue Location anpassen.
Download .NET Essentials Installer
Trickkiste

DasBackup 1.1.0 Beta 2 im Anmarsch

13.06.07 - Tools, DasBackup
Beitrag von Norbert Eder
  Zuerst ein herzliches Dankeschön an alle die am Betatest (siehe DasBackup 1.1.0 Betatest gestartet) teilgenommen haben und mich mit Rückmeldungen versorgt haben.

Der Großteil der gefundenen Fehler ist bereits behoben, ebenso konnten viele Change Requests umgesetzt werden.

Bevor es nun tatsächlich an ein Release und somit auch an die nächste Version geht, wird es ab kommendem Wochenende eine öffentliche Beta 2 geben. Ein Release ist für Ende Juni/Anfang Juli angedacht.

Weitere Informationen folgen mit Verfügbarkeit der Beta 2.

  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Generische Typ-Informationen auslesen

13.06.07 - .NET, Grundlagen, Base Framework
Beitrag von Norbert Eder
 Wer viel mit Reflection arbeitet der bekommt es von Zeit zu Zeit natürlich auch mit generischen Datentypen zu tun. Vielfach wird die Frage gestellt, wie man hierbei an die Typ-Informationen der generischen Parameter gelangt. Die Lösung ist denkbar einfach:
Dictionary<int, string> dict = new Dictionary<int, string>();

Type dictType = dict.GetType();

Console.WriteLine("IsGenericType: " + dictType.IsGenericType);

foreach (Type t in dictType.GetGenericArguments())
    Console.WriteLine("Argument-Typ: " + t.FullName);

if (dictType.IsGenericParameter)
    foreach (Type t in dictType.GetGenericParameterConstraints())
        Console.WriteLine("Contraint: " + t.FullName);

Type typeDef = dictType.GetGenericTypeDefinition();
Console.WriteLine("TypeDefinition: " + typeDef.FullName);

Dieses kurze Beispiel zeigt, wie die Typen der generischen Parameter ausgelesen werden können.

So sieht das Ergebnis aus:
IsGenericType: True
Argument-Typ: System.Int32
Argument-Typ: System.String
TypeDefinition: System.Collections.Generic.Dictionary`2

Es lohnt sich in weiterer Folge, sich genauer mit den angebotenen Methoden und Eigenschaften der Klasse Type zu beschäftigen.

  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Lesestoff für ruhige Stunden

06.06.07 - Kunterbunt
Beitrag von Norbert Eder
  Wer, so wie ich, gerne liest und zur Abwechslung auch mal von der IT weit entferntes, dem möchte ich hier einen kleinen Tipp mit auf den Weg geben. Zu beachten sei aber, dass ich vermutlich einer der wenigen ITler bin, die nicht undbedingt alles was mit Science Fiction zu tun hat verehren, sondern viel mehr den Bereich Fantasy und Mystik.

So bin ich vor über einem Jahr auf die Bücher von Markus Heitz gestoßen. Nach den bekannten Büchern wie Die Zwerge, Schattenjäger usw. wandte ich mich seinem Epos Ulldart zu. Derzeit verschlinge ich pro Woche in etwa ein Buch der zahlreichen Bücher aus dieser Reihe.

Es lohnt sich auf jeden Fall Bücher von Markus Heitz zu lesen, da er des Deutschen mehr als mächtig ist und sämtliche Handlungen sehr spannend beschreibt.

Es gibt ja schließlich auch gute Bücher, die nicht von O'Reilly veröffentlicht wurden.

  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


DasBackup 1.1.0 Betatest gestartet

04.06.07 - Tools, DasBackup
Beitrag von Norbert Eder
  Soeben wurde der DasBackup 1.1.0p Betatest gestartet. Bis zum 17. Juni 2007 werden nun Fehler gesammelt und behoben.

Sollte noch jemand Interesse am Test haben, dann möge man mir dies über das Kontaktformular oder via Email an csharp@gmx.at mitteilen.

Informationen über DasBackup sind auf der DasBackup Projektseite verfügbar. Alle entsprechenden News finden sich in der Kategorie DasBackup.

Vielen Dank für die Unterstützung. Bei Fragen stehe ich natürlich jederzeit zur Verfügung.

  1 Kommentar - 586 mal angesehen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Builder Pattern in C#

01.06.07 - Entwicklung, Patterns, .NET, Grundlagen
Beitrag von Norbert Eder
 Eine Diskussion mit Thomas veranlasste mich, einige Beispiele für ein Builder Pattern im .NET Framework zu suchen, zu beschreiben und selbst ein kleines Beispiel aus der Praxis zu liefern.

Einführung


Grundlegend zählt das Builder Pattern zu den Object Creational Patterns - es werden durch dieses Entwurfmuster also Objekte erstellt. Sinn und Zweck des Builder Patterns ist es, den Objekt-Erstellungsprozess von der Repräsentation des Objektes zu entkoppeln. Dadurch ist es möglich, mit demselben Erstellungsprozess unterschiedliche Repräsentationen erstellen zu können.

Beispiel aus dem .NET Framework


Ein sehr gutes Beispiel aus dem .NET Framework ist durch den DbConnectionStringBuilder geben. Dieser stellt die Basisklasse für stark typisierte Ableitungen dar (SqlConnectionStringBuilder etc.). Sehen wir uns an dieser Stelle einen kurzen Sourcecode an:
SqlConnectionStringBuilder connStringBuilder = 
  new SqlConnectionStringBuilder();
connStringBuilder.DataSource = "(local)";
connStringBuilder.InitialCatalog = "MyDatabase";
connStringBuilder.UserID = "username";
connStringBuilder.Password = "$password%";

SqlConnection sqlConn = 
  new SqlConnection(connStringBuilder.ToString());

Mit Hilfe des SqlConnectionStringBuilder ist es möglich, einfach einen syntaktisch korrekten ConnectionString zu erstellen, woraus in weiterer Folge ein Connection-Objekt gebildet werden kann.

Ein eigenes Beispiel


Nun sehen wir uns anhand eines eigenen Beispiels die Implementierung des Builder Patterns an. Grundlage bilden Adressdaten, die in einer XML-Datei vorliegen und importiert werden müssen. Den Part des Importierens ersparen wir uns. Die erstellten Objekte werden lediglich in eine Liste gelegt und anschließend per ToString ausgegeben.



Wie in der Abbildung zu sehen ist, besteht diese Implementierung des Builder-Patterns aus zwei wichtigen Teilen:

- AddressBuilder
- AddressParser

Der Parser selbst ist kein echter Bestandteil des ursprünglichen Builder-Patterns, wurde jedoch in diesem Beispiel zum Parsen der Adressdaten herangezogen und in das Pattern integriert, um die Zuständigkeiten der Objekte sauber zu trennen.
public class AddressParser : AParser
{
    AddressBuilder _builder = null;

    public AddressParser(IBuilder builder)
    {
        _builder = (AddressBuilder)builder;
    }

    public override void Parse(XmlNode data)
    {
        if (data != null && _builder != null)
        {
            _builder.ResetData();

            XmlNode xnStreet = data.SelectSingleNode("street");
            XmlNode xnStreetNumber = 
                data.SelectSingleNode("streetnumber");
            XmlNode xnZip = data.SelectSingleNode("zip");
            XmlNode xnCity = data.SelectSingleNode("city");
            XmlNode xnCountry = data.SelectSingleNode("country");

            if (xnStreet != null) 
                _builder.Street = xnStreet.InnerText;
            if (xnStreetNumber != null) 
                _builder.StreetNumber = xnStreetNumber.InnerText;
            int zip = 0;
            if (xnZip != null) 
                Int32.TryParse(xnZip.InnerText, out zip);
            _builder.Zip = zip;
            if (xnCity != null) 
                _builder.City = xnCity.InnerText;
            if (xnCountry != null) 
                _builder.Country = xnCountry.InnerText;                
        }
    }
}


Der AddressBuilder selbst besitzt nun die Aufgabe, das eigentliche Address-Objekt zu erstellen und zurück zu liefern.
public class AddressBuilder : ABuilder
{
    private string _street = null;
    private string _streetnumber = null;
    private int _zip = 0;
    private string _city = null;
    private string _country = null;

    public string Street
    {
        get { return this._street; }
        set { this._street = value; }
    }

    public string StreetNumber
    {
        get { return this._streetnumber; }
        set { this._streetnumber = value; }
    }

    public int Zip
    {
        get { return this._zip; }
        set { this._zip = value; }
    }

    public string City
    {
        get { return this._city; }
        set { this._city = value; }
    }

    public string Country
    {
        get { return this._country; }
        set { this._country = value; }
    }

    public void ResetData()
    {
        this._city = null;
        this._country = null;
        this._street = null;
        this._streetnumber = null;
        this._zip = 0;
    }

    public override BaseObject Build()
    {
        Address address = new Address();

        address.City = this._city;
        address.Country = this._country;
        address.Street = this._street;
        address.StreetNumber = this._streetnumber;
        address.Zip = this._zip;

        return address;
    }
}

Die Ausführung der gesamten Anwendung erfolgt durch nachfolgenden Sourcecode:
List<Address> addresses = new List<Address>();

XmlDocument doc = new XmlDocument();
doc.Load("addresslist.xml");

XmlNodeList xnlAddresses = doc.SelectNodes("/addresses/address");

if (xnlAddresses != null && xnlAddresses.Count > 0) 
{
    AddressBuilder builder = new AddressBuilder();
    AddressParser parser = new AddressParser(builder);

    foreach (XmlNode xnAddress in xnlAddresses) 
    {
        parser.Parse(xnAddress);
        Address address = (Address)builder.Build();
        addresses.Add(address);
    }
}

foreach (Address a in addresses)
{
    Console.WriteLine(a.ToString());
    Console.WriteLine("---------------------");
}

Console.Read();


Fazit


Über dieses Pattern können durch kleine Anpassungen unterschiedlichste Typen abgewickelt werden, was sich sehr schnell positiv auswirkt und zudem alle für die passende Aufgabe notwendigen Schritte trennt. Dadurch lassen sich diese entsprechend anpassen bzw. gänzlich ersetzen.

Download Builder Pattern Demo

  2 Kommentare - 716 mal angesehen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Interessante ASP.NET Artikel

01.06.07 - .NET, ASP.NET
Beitrag von Norbert Eder
 Peter hat in den letzten Tagen zwei - für angehende ASP.NET Entwickler - sehr interessante Artikel gepostet, auf ich an dieser Stelle verlinken möchte:

Von WebControl abgeleitetes CustomControl - Haupt Html Element festlegen
WaitButtonControl - Auf langes Postback warten

Viel Spass.

  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


.NET ClickOnce via Firefox

31.05.07 - .NET, Allerlei, Tools, 3rd Party Tools
Beitrag von Norbert Eder
 .NET ClickOnce ist mit Firefox nicht durchführbar und blieb daher den Internet Explorer Benutzern vorenthalten. Bei den Firefox Add-Ons befindet sich allerdings eines namens FFClickOnce [1] welches diese Funktionalität hinzufügt.

Firefox: 1.5 – 2.0.0.*

Wer sich über das Thema ClickOnce informieren möchte, der sei auf den Artikel ClickOnce des MSDN's verwiesen.

[1] FFClickOnce Download

  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


NClass - kostenloser UML Klassen Designer

30.05.07 - .NET, Allerlei, Tools, 3rd Party Tools
Beitrag von Norbert Eder
  Wer einen leichtgewichtigen UML Klassen Designer sucht, der findet ein kostenloses Tool in NClass. Zwar bietet es nicht allzu viele Funktionalitäten, dennoch sollte es genügen, um einen schnellen Überblick über ein kleines Projekt zu erhalten. Für größere Projekte eignet sich das Tool sicherlich nicht, da dafür entsprechende Funktionen einfach fehlen. Da das Projekt jedoch erst im Oktober 2006 erstmalig veröffentlicht wurde, darf noch einiges zu erhoffen sein.

Aktuelle Features

* Precision snapping to align objects without grid
* Support for two languages: C# and Java
* Declaration parser for class members to edit them faster
* Strict syntactical/semantical controlling
* Configurable diagram styles
* Multilanguage user interface
* Printing/saving to image

Geplante Features

* Association name, role and cardinality fields
* Zooming in/out
* Packages
* Class and member comments for documenting
* Source generator
* Disassemble .NET assemblies

Es lohnt sich auf jeden Fall, das Projekt im Auge zu behalten.

  1 Kommentar - 1649 mal angesehen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Tipps zum Debugging

25.05.07 - .NET, Visual Studio
Beitrag von Norbert Eder
 Visual Studio 2005 bietet kleine nette Features zum Thema Debuggen an, die nicht sehr häufig von Entwicklern genutzt werden. Dabei können diese kleinen Möglichkeiten das Leben durchaus erleichtern.

Setzen wir an einer bestimmten Stelle im Sourcecode (ich verwende hier ein paar wenige Sourcecode-Zeilen zur Veranschaulichung). Per rechter Maustaste auf den Breakpoint erhalten wir ein Kontextmenü mit einigen hilfreichen Einträgen.



Sehen wir uns den Punkt Condition... genauer an.



Beim Durchlaufen des Sources wird bei jedem Hit des Breakpoints die eingegebene Bedingung überprüft. Trifft diese zu (sofern der Punkt Is true gewählt wurde), wird an dieser Stelle unterbrochen, wie im nächsten Screenshot gut zu sehen ist.



Eine weitere Möglichkeit ist durch den Punkt When Hit... gegeben.



Durch diesen wird ein Einstellungsfenster geöffnet, in dem einige Settings vorgenommen werden können:



So kann bei jedem Hit des Breakpoints eine Message ins Consolen-Fenster geschrieben, ein Makro ausgeführt, oder unterbrochen werden.

Es lohnt sich auf jeden Fall, auch die anderen Punkte näher anzusehen, da bestimmte Features recht oft sinnvoll eingesetzt werden können. Damit läßt sich die Produktivität steigern und der Ärger des Debuggens senken.

Weitere Informationen zum Thema Debuggen:
Visual Studio 2005: Default Browser setzen
Webprojekte mittels Firefox debuggen
Unable to debug: The binding handle is invalid.

  Kommentar hinzufügen - 2 mal angesehen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Genervt von Telefonmarketing-Anrufen?

25.05.07 - Kunterbunt
Beitrag von Norbert Eder
 Es kommt ja immer wieder mal vor, dass unbekannte Personen von sogenannten Telemarketing-Unternehmen anrufen, um ihren Fragebogen herunterzuspulen. Da es mitunter auch oft geheime Telefonnummern erwischt (worüber diese Angerufenen dann meist nicht sehr erfreut sind), bietet es sich an, sich ein wenig zur Wehr zu setzen.

Dieses Anti-Telemarketing Gegenwehrskript bietet einen Ablauf, um den Anrufer aus dem Konzept zu bringen und den Spieß umzudrehen. Viel Spaß beim nächsten Telemarketing-Anruf.

  4 Kommentare - 1061 mal angesehen   |  1 Trackbacks   |  Permalink  |  Trackback-URL



Zurück Weiter