dream-coder.de Blog über .NET, SQL Server, PHP, Typo3 und sonstige Themen

31Jan/105

Singleton Muster

Das Singleton Muster (Singleton Pattern) ist ein Entwurfsmuster in der Sofwareentwickung, welches beschreibt, das man ein Objekt nur einmal instanziieren darf.

Was genau wird realisiert?

Der Konstruktor des Objektes wird auf private gesetzt. Dies hat zur Folge, das man keine Instanz mit dem new Operator erstellen kann. Danach wird eine statische Methode erstellt, die eine neue Instanz des Objektes zurück gibt. In dieser Methode wird überprüft, ob es schon eine Instanz gibt, anhand einer statischen Membervariable. Das wars. Eingesetzt wird dies unter anderem bei Winforms, damit man ein Fenster nicht mehrfach erzeugen kann.

class Singleton
{
        /**
         * @var Singeleton
         */
	private static $_instance;
 
        /**
         * Kontruktor MUSS logischerweise auf private gesetzt werden
         */
	private function __construct() { /* beliebiger CODE */ }
 
        /**
         * @return Singleton
         */
	public function getInstance() {
		if (self::$_instance == null || !(self::$_instance instanceof Singeleton)) {
			self::$_instance = new Singleton();
		}
		return self::$_instance;
	}
}
 
// aufruf
$mySingletonOnject = Singleton->getInstance();

Quelle: Wikipedia DE

// Nur zur Veranschaulichung – bitte nicht verwenden!
sealed class Singleton
{
    private Singleton() { /* beliebiger CODE im Kontruktor */ }
    private static Singleton _instance = null;
 
    public static Singleton getInstance()
    {
       if(_instance == null) {
          _instance = new Singleton();
       }
       return _instance;
    }
}
 
// Diese Version verwenden, wegen der ThreadSicherheit
sealed class Singleton
{
    private Singleton() { /* beliebiger CODE */ }
    private static volatile Singleton _instance = null;
 
    public static Singleton getInstance()
    {
       // DoubleLock
       if(_instance == null) {
          lock(m_lock) {
              if (_instance == null) {
                  _instance = new Singleton();
              }
          }
       }
       return _instance;
    }
 
    // Hilfsfeld für eine sichere Threadsynchronisierung
    private static object m_lock = new object();
}
 
// Zugriff über Singleton 
Singleton MySingletonObject = Singleton.getInstance();

Für weitere Informationen zu Singleton oder weiteren Design Pattern empfehle ich folgende Links

Edit: eine erweiterte Variante, basieren auf Dirk Primbs Post

sealed class Singleton
{
    // > c# 2008 - Hier wird eine statische Variable erzeugt, die mit 
    // volatile => Threadsafe
    // readonly => mit dem Schlüsselwort stellen wir sicher, das keine neue Instanz erzeugt wird
    public static readonly volatile Singleton Instance = new Singleton();
 
    public string Name {get; set; }
 
    // Konstruktor auf private
    private Singleton() { /* beliebiger CODE */ }
 
}
 
 
// Testing
var x = Singleton.Instance;
x.Name = "Hans";
 
var y = Singleton.Instance;
y.Name = "Werner";
 
// Beide Ausgaben ergeben Werner, weil es nur eine Instanz des Objektes zurückgegeben wird
Console.WriteLine("X: " + x.Name);
Console.WriteLine("Y: " + y.Name);
Console.ReadLine();
17Jul/080

Controls innerhalb von LoginView ansprechen

Hallo,

manchmal sieht man den Wald vor lauter Bäumen nicht Icon Wink in  // dream-coder.de . Nun suchte ich eine Methode, um auf die Controls innerhalb eines asp:LoginView Controls zuzugreifen.

Fündig geworden bin ich hier, und ich nutze die FindControl Methode so oft ..., manchmal ärgerlich.

Ich zeige es einmal anhand des Beispiels von Thomas.

asp.net
[html]





[/html]

c#
[csharp]

protected void Page_Load(object sender, EventArgs e)
{
Label anonymousLabel = (Label)LVBla.FindControl("AnonymousLabel");

if (anonymousLabel != null) {
anonymousLabel.Text = DateTime.Now.ToString();
}
}
[/csharp]

Und das ganze nochmal in VB.NET

vb.net
[vb]
Dim anonymousLabel As Label = CType(Me.LoginView1.FindControl("AnonymousLabel"), Label)

If Not (anonymousLabel Is Nothing) Then
anonymousLabel.Text = DateTime.Now.ToString()
End If
[/vb]

14Mar/080

[C#] – Bilder von einer URL laden und für DB vorbereiten

Hi

ich hoffe das hilft euch ein wenig:

Ich brauchte eine Variante, um Bilder (die Url der Bilder habe ich) von einer Website zu laden und für das speichern in eine Datenbank vorzubereiten. Da habe ich HttpWebRequest gefunden und bin zur folgenden Lösung gekommen:

[csharp]
// generate WebRequest
// this.ImageHTTPSrc == "http://www.example.com/image.jpg"
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(this.ImageHTTPSrc);

// timeout
request.Timeout = 10000; // 10 secs
request.ReadWriteTimeout = 10000;

// get imagadata
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

// save in Stream object
Stream resStream = response.GetResponseStream();

// create a image object from stream
this.ImageData = Image.FromStream(resStream);

// close
resStream.Close();
response.Close();

// convert Image2ByteArray | for database
ImageConverter imgConv = new ImageConverter();
this.ImageDataByteArray = (byte[])imgConv.ConvertTo(this.ImageData, System.Type.GetType("System.Byte[]"));

// save image object 2 fs
//this.ImageData.Save("c:\\tmp\\" + this.strNumber+".jpg");
[/csharp]

Natürlich muss man hier noch die Excepitons abfangen usw. Aber als Anregung soll dies reichen Icon Smile in  // dream-coder.de

Tagged as: , No Comments
4May/072

Membership UserId auslesen und an GridView / DetailView als Parameter übergeben

Hallo,

wenn man ASP.NET 2.0 nutzt und die dazugehörige Userverwaltung, kann man für seine eigene Tabellen mal die UserId gebrauchen. sie ist im SQL Server 2005 vom DatenTyp uniqueidentifier.

Bekommt tut man diese über folgende CodeZeilen:

// userdaten holen
MembershipUser myObject = Membership.GetUser ( );
 
// userid extrahieren (ist aber vom Typ System.Guid)
string tmpUserID = myObject.ProviderUserKey.ToString ( );

Um diese nun als zusätzlichen Parameter in einem Grid- / DetailsView zu übergeben. muss man nun folgende Ereignisse bearbeiten:

GridView (beim update):

protected void gvNews_RowUpdating ( object sender, GridViewUpdateEventArgs e ) {
        // userdaten holen
        MembershipUser myObject = Membership.GetUser ( );
 
        // userid extrahieren (ist aber vom Typ System.Guid)
        string tmpUserID = myObject.ProviderUserKey.ToString ( );
 
        // als parameter hinzufügen
        e.NewValues.Add ( "username", tmpUserID );
    }

DetailsView (insert)

protected void dvAddNews_ItemInserting ( object sender, DetailsViewInsertEventArgs e ) {
 
        // userdaten holen
        MembershipUser myObject = Membership.GetUser ( );
 
        // userid extrahieren (ist aber vom Typ System.Guid)
        string tmpUserID = myObject.ProviderUserKey.ToString ( );
 
        // als parameter hinzufügen
        e.Values.Add ( "username", tmpUserID );
    }

Wenn es noch einfacher geht, bitte melden Icon Smile in  // dream-coder.de

21Dec/060

[KnowHow] – System.Diagnostics.Stopwatch (Zeitmessung)

Fürs Archive Icon Smile in  // dream-coder.de

Sehr schön.

Sowas habe ich auch schonmal gesucht, dabei ist alles onBoard...

Mit dieser Klasse lassen sich Zeitmessungen von den eigenen Algorithmen messen.

[csharp]
System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();
s.Start(); // Start Zeitlauf
// Algorithmus durchfuehren
....
s.Stop(); // Ende Zeitlauf
Console.WriteLine("Test1: {0}", s.ElapsedMilliseconds); // Ausgabe der benoetigten Zeit fuer den Algorithmus
[/csharp]

via Andreas Maiers

Tagged as: , No Comments
5Dec/060

[C#] – Vermeide if(bool == true)

Hier mal ein kleiner Beitrag, warum man

[csharp]
if(myBoolean == true) {
// ...
}

// oder
if(myBoolean == false) {
//...
}
[/csharp]

nicht mehr verwenden sollte. Icon Wink in  // dream-coder.de

Besser:
[csharp]
if(myBoolean) {
// ...
}

// oder
if(!myBoolean) {
//...
}
[/csharp]

via NorbertEder

Tagged as: , No Comments
15Aug/060

[ASP.NET] – siteMapNode um eigene Tags erweitern

Hy

Ich war auf der Suche nach einer Möglichkeit, an siteMapNodes Bilder zu benutzen. Die Lösung fand ich bei bei Thomas und ist hier für das Archiv.

Und zwar wird dabei die Datenbindung manuell erweitert.

[asp]

[/asp]

Die Datenbindung:
[csharp]
public void OnItemBound(object sender, MenuEventArgs args) {
args.Item.ImageUrl = ((SiteMapNode)args.Item.DataItem)["imageUrl"];
}
[/csharp]

und im Menue Control geben wir die Methode an:
[asp]

[/asp]

http://weblogs.asp.net/bleroy/archive/2006/01/24/436350.aspx

in diesem Sinne

11Aug/060

Generische Datentypen<>

Was sind eigentlich generische Datentypen ?

Genrische Datentypen sind sozusagen 'Variable Datentypen'. Man bestimmt den Typ (string, int, float, ArrayList, eigene Typen, usw ...) erst beim erzeugen eines Objektes. Somit ist eine ArrayList zum Beispiel Typensicher.

Dies funktioniert wie folgt:

[csharp]
public partial class CBeispiel {

private param m_variable;

public param Variable {
set { this.m_variable = value; }
get { return(this.m_variable); }
}
}
[/csharp]