Laden...

Singleton ein Inteface zuweisen

Erstellt von flobow vor 15 Jahren Letzter Beitrag vor 15 Jahren 944 Views
F
flobow Themenstarter:in
53 Beiträge seit 2007
vor 15 Jahren
Singleton ein Inteface zuweisen

Hallo,
ich hab folgende Frage ich habe eine Singleton Klasse

z.b


public sealed class DatabaseService
	{
       
        public delegate void DatabaseErrorDelegate(DBErrorType type,string message);
        public event DatabaseErrorDelegate OnDatabaseError;

		private static DatabaseService instance = new DatabaseService();
		
		public static DatabaseService Instance {
			get {
				return instance;
			}
		}
		
		private DatabaseService()
		{
		}

Nun möchte ich ein Inteface dafür definiere. ´Bei Normalen Klassen wäre wäre das kein Problem nur bei Singleton hab ich irgendwie ein Brett vorm Kopf

Das Interface darf die Singleton klasse nicht kennen.
Also hab ich mir folgendes überlegt.



IDatabaseService
{
  static IDatabaseService Instance();
   void Funkrion1();

}


Problem ist nun das das Inteface erst instanziert werden muss 😦 oder gibts da ein anderen kniff. Irgendwie klappt das nicht..

915 Beiträge seit 2006
vor 15 Jahren

Hrm, schreib ein Interface IDatabaseService und schreibe dort alle relevanten Methoden Properties usw. rein. Deine Singletonklasse hat ja logischerweise einen private Konstruktor und ist Sealed usw. Daher spricht ein Property oder Member an für die Instanz.


private static DatabaseService instance;

public static IDatabaseService Instance
{
   get 
   {
       if(instance == null)
         instance = new DatabaseService();
       return instance;
   }
}

// Constructor
private DatabaseService() { }

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

F
flobow Themenstarter:in
53 Beiträge seit 2007
vor 15 Jahren

Vielen dank es funktzt!!



public sealed class DatabaseService :IDatabaseService
	{
       
        public delegate void DatabaseErrorDelegate(DBErrorType type,string message);
        public event DatabaseErrorDelegate OnDatabaseError;

        private static IDatabaseService instance;
		
		public static IDatabaseService Instance {
			get {

                if (instance == null)
                {
                    instance = new DatabaseService();
                }
				return instance;
			}
		}
		
		private DatabaseService()
		{
		}


habs jetzt so abgeändert

F
flobow Themenstarter:in
53 Beiträge seit 2007
vor 15 Jahren

leider meckert er das er im Interface nichts statisches definieren kann mhh..

2.760 Beiträge seit 2006
vor 15 Jahren

leider meckert er das er im Interface nichts statisches definieren kann mhh..

Das kannst du doch nicht machen 😉 static abstract?

915 Beiträge seit 2006
vor 15 Jahren

Wieso statisch 🤔

Brauchst doch nichts statisch definieren, ich glaube eher du brauchst ne ordentliche portion Kaffee und Sonne 😉

Du rufst doch wie folgt auf:

DatabaseService.Instance und bekommst nun die "public member / public methods oder public proeprties" von DatabaseService die von IDatabaseService angeboten werdne zurück.

Du brauchst da keine einzige zusätzliche statische Methode - den sonst ist's keine Singleton mehr.

Hier mal ein beispiel, hab's allerdings so runtergetippselt:



	public delegate void ErrorDelegate(string message);
	public interface IDatabaseService
	{
		string WieGehtDasABC { get; set; }
		event ErrorDelegate ErrorEvent;
	}

	public sealed class DatabaseService : IDatabaseService
	{
		public event ErrorDelegate ErrorEvent;
		private static IDatabaseService instance;
		public static IDatabaseService Instance
		{
			get
			{
				if (instance == null)
					instance = new DatabaseService();
				return instance;
			}
		}

		private string m_sNonsens = "ABC";

		public string WieGehtDasABC
		{
			get { return this.m_sNonsens; }
			set
            {
                    if(value != "ABC")
                            if(this.ErrorEvent != null)
                            this.ErrorEvent(string.Format("Da will mir jemand weismachen ABC wäre {0}", value));
                    else
                    this.m_sNonsens = value;
            }

		}
	}

	public class MyClass
	{
		private MyClass()
		{
			DatabaseService.Instance.ErrorEvent += new ErrorDelegate(OnError);

			DatabaseService.Instance.WieGehtDasABC = "ÄhmKeineAhnung?";
		}

		private void OnError(string error)
		{
			Console.WriteLine(error);
		}
	}

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(