ASP.NET und Dll's



  • Hallo Leute,

    ich hab folgendes Problem: Hab für eine ASP.NET Anwendung eine Dll in C# geschrieben, die für die Web Applikation eine konfigurierbare Datenbankverbindung aufbaut und ein DataSet zurückliefert. Die Dll wird - so glaube ich - in den aspnet_wp.exe Prozess gelinkt. Ich habe die Klasse nämlich als singleton entworfen und sie lässt sich nur bei der ersten Session instanzieren. Wenn jetzt alle Sessions der Web Anwendung darauf zugreifen, geht das so einfach (tschuldige die naive Frage) ? Weil es ja dann ein Mehrfachzugriff auf nur eine Dll ist. Sie wird ja in den Application Domains des Arbeitsprozesses nicht repliziert. 😕 😕

    Danke für eure Hile!!! 🕶



  • Hi,

    hängt von der Implementierung ab. Du musst das schon Threadsicher machen.

    Generell ist das keine gute Idee.

    Aus deiner Beschreibung heraus kann man nicht wirklich den Sinn erkennen.

    Ich biete mal 2 Möglichkeiten:

    1. Die Datenmenge (das DataSet) ist stets gleich

    // vielleicht sowas
    public class ProgramCache
        {
            private System.Web.Caching.Cache cache = HttpRuntime.Cache;
    
            public void storeIntoCache(object obj, string key)
            {
                cache.Insert(key, plan, null, DateTime.MaxValue, new TimeSpan(2, 0, 0, 0));
            }
            public object getFromCache(string key)
            {
                return cache[key];
            }
        }
    

    2. Datenmenge kann sich bei jeden Aufruf ändern

    dann würde ich ein Service dahinter schalten. Z.B. EnterpriseServices oder WebService, das die Daten liefert.



  • using System;
    using System.Data;
    using MySql.Data.MySqlClient;
    using System.Configuration;
    using System.Diagnostics;
    
    namespace DataConnection
    {
    	//singleton design pattern
    	public class DataConnector
    	{
    		private MySqlConnection conn=null;
    		private MySqlDataAdapter adapt=null;
    
    		//private constructor
    		private DataConnector()
    		{
    			Trace.AutoFlush=true;
    			Trace.Listeners.Add(new TextWriterTraceListener("C://Tracing.txt"));
    			Trace.WriteLine(DateTime.Now.ToShortTimeString()+" DataConnector gestartet");
    		}
    
    		private static uint instanceCounter=0;
    
    		private string getValue(string Key)
    		{
    			return System.Configuration.ConfigurationSettings.AppSettings[Key];
    		}
    
    		//internal connecting processing
    		private DataTable connect(string Module)
    		{
    			DataTable t=new DataTable();
    			adapt.Fill(t);
    			Trace.WriteLine(DateTime.Now.ToShortTimeString()+ " "+Module+" aus Datenbank aquiriert");
    			return t;
    		}
    
    		//internal update processing
    		private void update(string Module,DataTable T)
    		{
    			MySqlCommandBuilder builder=null;
    			try
    			{
    				builder=new MySqlCommandBuilder(adapt);
    				adapt.RowUpdated+=new MySqlRowUpdatedEventHandler(adapt_RowUpdated);
    				adapt.Update(T);
    				Trace.WriteLine(DateTime.Now.ToShortTimeString()+ " "+Module+" Update durchgefuehrt");
    			}
    			finally
    			{
    				builder.Dispose();
    			}
    		}
    
    		private void initializeConnection(string ConnKey, string CommKey)
    		{
    			conn=new MySqlConnection(getValue(ConnKey));
    			conn.Open();
    			adapt=new MySqlDataAdapter(getValue(CommKey),conn);						
    		}
    
    		//called by module manager
    		public static DataConnector StartConnector()
    		{
    			//first request?
    			if(DataConnector.instanceCounter++==0)return new DataConnector();
    			return null;
    		}
    
    		//called by module manager
    		//data module returning to module manager
    		public DataTable GetData(string Module)
    		{
    			try
    			{
    				initializeConnection(Module+"Conn",Module+"Comm");
    				return connect(Module);
    			}
    			catch(System.Exception ex)
    			{
    				//error while connecting...
    				throw(new System.Exception("Fehler bei Verbindungsaufbau!",ex));
    			}
    			finally
    			{
    				adapt.Dispose();
    				conn.Close();
    			}
    		}
    
    		//called by module manager
    		//data module update
    		public void UpdateData(string Module,DataTable T)
    		{
    			try
    			{
    				initializeConnection(Module+"Conn",Module+"Comm");
    				update(Module,T);
    			}
    			catch(System.Exception ex)
    			{
    				//error while updating...
    				throw(new System.Exception("Fehler bei Updatevorgang!",ex));
    			}
    			finally
    			{
    				adapt.Dispose();
    				conn.Close();
    			}
    		}
    
    		private void adapt_RowUpdated(object sender, MySqlRowUpdatedEventArgs e)
    		{
    			if(e.Status==UpdateStatus.ErrorsOccurred){
    				e.Status=UpdateStatus.SkipCurrentRow;
    				Trace.WriteLine(DateTime.Now.ToShortTimeString()+e.Command.CommandText);}
    		}
    	}
    }
    

    Sie holt einzelne Tabellen aus einer MySQL Server Datenbank. Die Verbindungen und SELECT - Kommandos sind im Web.config File

    Soll ich es in ein Web Service einbetten?


Anmelden zum Antworten