Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 36
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072

    Applicazione n-tier ho letto miiiiiille esempi e ci ho provato ... mi restano alcuni

    Ho provato a gestire una semplice tabella del DB con una logica n-tier


    WebUtente.cs

    using System;
    using System.Data;

    public class WebUtente
    {
    private string _nome;
    private string _cognome;
    private string _mail;
    private string _password;

    public string Nome
    {
    get { return _nome; }
    set { _nome = value; }
    }

    public string Cognome
    {
    get { return _cognome; }
    set { _cognome = value; }
    }

    public string Mail
    {
    get { return _mail; }
    set { _mail = value; }
    }

    public string Password
    {
    get { return _password; }
    set { _password = value; }
    }

    }



    WebUtentiCollection.cs

    using System;
    using System.Collections.Generic;
    using System.Text;

    public class WebUtentiCollection : List<WebUtente>
    {


    }




    WebUtentiManager.cs

    using System;
    using System.Collections.Generic;
    using System.Text;

    public class WebUtentiManager
    {
    public WebUtentiCollection GetAllWebUtenti()
    {
    return GetAllWebUtenti(false);
    }

    public WebUtentiCollection GetAllWebUtenti(bool getUtenti)
    {
    // collection di utenti, dal DataLayer
    WebUtentiData data = new WebUtentiData();
    WebUtentiCollection utenti = data.GetAll();

    //Perchè per accedere agli elementi della collection devo fare [i].NomeCampo?
    //utenti[i].

    return utenti;
    }
    }



    WebUtentiData.cs

    public class WebUtentiData
    {
    public WebUtentiCollection GetAll()
    {
    SqlHelper h = new SqlHelper();

    WebUtentiCollection utenti = new WebUtentiCollection();
    WebUtente utente;

    using (SqlDataReader dr = h.ExecuteQuery("SELECT * FROM titles"))
    {
    string nomeOrdinal = dr.GetOrdinal("nome");
    string cognomeOrdinal = dr.GetOrdinal("cognome");
    string mailOrdinal = dr.GetOrdinal("mail");

    while (dr.Read())
    {
    utente = new WebUtente();
    utente.Nome = dr.GetString(nomeOrdinal);
    utente.Cognome = dr.GetString(cognomeOrdinal);
    utente.Mail = dr.GetString(mailOrdinal);

    utenti.Add(utente);
    }
    }

    return utenti;
    }
    }





    I miei dubbi sono i seguenti (sperando cmq che la logica che ho creato, e postato sopra, sia corretta)

    1) nell'esempio viene usato un oggetto SqlHelper, dove posso trovare il codice di questo oggetto?

    2) la mia collection è vuota ....


    public class WebUtentiCollection : List<WebUtente>
    {


    }


    perchè?? cosa dovrei inserire qui?? (oppure va bene cosi???)

    3) nella classe utentiManager, perchè per accedere agli elementi della collection devo fare [i].NomeCampo
    (inoltre è giusta la collection come l'ho creata io (ovvero vuota)??? vedi punto 2.)

    4) cosa devo inserire nella classe WebUtentiManager?? Se nella classe Data gestisco le interrogazioni al DB, nel Manager dovrei gestire la logica di business .... a livello teorico mi è chiaro, ma a livello pratico non saprei cosa gestire in questa classe, potreste farmi un semplice esempio pratico di implementazione all'interno del manager?

    5) più che un dubbio è un consiglio: l'uso del datareader per accedere ad una SELECT * è corretto?? Oppure esiste una soluzione piu "performante" per records di grandi dimensioni?


    Grazie infinite per la pazienza e per l'aiuto!

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072

    Re: Applicazione n-tier ho letto miiiiiille esempi e ci ho provato ... mi restano alcuni

    Originariamente inviato da Valeria75_bis
    Ho provato a gestire una semplice tabella del DB con una logica n-tier

    Codice PHP:

    WebUtente
    .cs

    using System
    ;
    using System.Data;

    public class 
    WebUtente
    {
        private 
    string _nome;
        private 
    string _cognome;
        private 
    string _mail;
        private 
    string _password;

        public 
    string Nome
        
    {
            
    get { return _nome; }
            
    set _nome value; }
        }

        public 
    string Cognome
        
    {
            
    get { return _cognome; }
            
    set _cognome value; }
        }

        public 
    string Mail
        
    {
            
    get { return _mail; }
            
    set _mail value; }
        }

        public 
    string Password
        
    {
            
    get { return _password; }
            
    set _password value; }
        }
      
    }



    WebUtentiCollection.cs

    using System
    ;
    using System.Collections.Generic;
    using System.Text;

    public class 
    WebUtentiCollection : List<WebUtente>
    {
     

    }




    WebUtentiManager.cs

    using System
    ;
    using System.Collections.Generic;
    using System.Text;

    public class 
    WebUtentiManager
    {
        public 
    WebUtentiCollection GetAllWebUtenti()
        {
            return 
    GetAllWebUtenti(false);
        }

        public 
    WebUtentiCollection GetAllWebUtenti(bool getUtenti)
        {
            
    // collection di utenti, dal DataLayer
            
    WebUtentiData data = new WebUtentiData();
            
    WebUtentiCollection utenti data.GetAll();

            
    //Perchè per accedere agli elementi della collection devo fare [i].NomeCampo?
            //utenti[i].

            
    return utenti;
        }
    }



    WebUtentiData.cs

    public class WebUtentiData
    {
        public 
    WebUtentiCollection GetAll()
        {
            
    SqlHelper h = new SqlHelper();

            
    WebUtentiCollection utenti = new WebUtentiCollection();
            
    WebUtente utente;

            
    using (SqlDataReader dr h.ExecuteQuery("SELECT * FROM titles"))
            {
                
    string nomeOrdinal dr.GetOrdinal("nome");
                
    string cognomeOrdinal dr.GetOrdinal("cognome");
                
    string mailOrdinal dr.GetOrdinal("mail");

                while (
    dr.Read())
                {
                    
    utente = new WebUtente();
                    
    utente.Nome dr.GetString(nomeOrdinal);
                    
    utente.Cognome dr.GetString(cognomeOrdinal);
                    
    utente.Mail dr.GetString(mailOrdinal);

                    
    utenti.Add(utente);
                }
            }

            return 
    utenti;
        }



    I miei dubbi sono i seguenti (sperando cmq che la logica che ho creato, e postato sopra, sia corretta)

    1) nell'esempio viene usato un oggetto SqlHelper, dove posso trovare il codice di questo oggetto?

    2) la mia collection è vuota ....


    public class WebUtentiCollection : List<WebUtente>
    {


    }


    perchè?? cosa dovrei inserire qui?? (oppure va bene cosi???)

    3) nella classe utentiManager, perchè per accedere agli elementi della collection devo fare [i].NomeCampo
    (inoltre è giusta la collection come l'ho creata io (ovvero vuota)??? vedi punto 2.)

    4) cosa devo inserire nella classe WebUtentiManager?? Se nella classe Data gestisco le interrogazioni al DB, nel Manager dovrei gestire la logica di business .... a livello teorico mi è chiaro, ma a livello pratico non saprei cosa gestire in questa classe, potreste farmi un semplice esempio pratico di implementazione all'interno del manager?

    5) più che un dubbio è un consiglio: l'uso del datareader per accedere ad una SELECT * è corretto?? Oppure esiste una soluzione piu "performante" per records di grandi dimensioni?


    Grazie infinite per la pazienza e per l'aiuto!

  3. #3

    Re: Applicazione n-tier ho letto miiiiiille esempi e ci ho provato ... mi restano alcuni

    Originariamente inviato da Valeria75_bis
    Ho provato a gestire una semplice tabella del DB con una logica n-tier
    ...
    I miei dubbi sono i seguenti
    1) nell'esempio viene usato un oggetto SqlHelper, dove posso trovare il codice di questo oggetto?
    SqlHelper sembra essere una classe appartenente ad una libreria gratuita creata da Microsoft e che si chiama MSDAAB Microsoft Data Access Application Block. La trovi su msdn sotto la voce simile a enterprise pattern (che e' una collection di libreria all'interno della quale c'e' anche il msdaab).
    Questa libreria ha la funzione di evitare al programmatore le operazioni ripetitive es. per creare e utilizzare un datareader e cosi via.
    2) la mia collection è vuota ....
    perchè?? cosa dovrei inserire qui?? (oppure va bene cosi???)
    Cosa intendi per vuota?
    E' vuota nel senso che non contiene alcun oggetto (e' una collection di oggetti di tipo WebUtente) ma la puoi riempire come e quando vuoi
    es. per metterci un oggetto vuoto puoi fare
    WebUtentiCollection coll = new WebUtentiCollection();
    coll.Add(new WebUtente());
    Se per vuota intendi che e'... vuota di codice, allora ti invito ad approfondire i cosidetti generics. I generics offrono la possibilita' di "tipizzare" delle collection altrimenti "generiche" semplicemente passando il tipo. Nel codice che hai postato questo viene fatto qui:
    ...tion : List<WebUtente>
    3) nella classe utentiManager, perchè per accedere agli elementi della collection devo fare [i].NomeCampo
    dovrai fare
    tuacollection[indice].nomecampo
    meglio di cosi non esiste niente. Non vedo dove sia il problema.
    Saluti a tutti
    Riccardo

  4. #4

    Re: Applicazione n-tier ho letto miiiiiille esempi e ci ho provato ... mi restano alcuni

    Per quello che riguarda le Entity e le Collection credo che tu sia sulla strada giusta, anche se credo che dovresti ulteriormente arricchirle.

    WebUtentiManager.cs

    codice:
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    public class WebUtentiManager
    {
        public WebUtentiCollection GetAllWebUtenti()
        {
            return GetAllWebUtenti(false);
        }
    
        public WebUtentiCollection GetAllWebUtenti(bool getUtenti)
        {
            // collection di utenti, dal DataLayer
            WebUtentiData data = new WebUtentiData();
            WebUtentiCollection utenti = data.GetAll();
    
            //Perchè per accedere agli elementi della collection devo fare [i].NomeCampo?
            //utenti[i].
    
            return utenti;
        }
    }
    A cosa ti serve il flag getUtenti che passi come parametro al metodo GetAllWebUtenti?
    Veniamo alle domande.

    Originariamente inviato da Valeria75_bis
    1) nell'esempio viene usato un oggetto SqlHelper, dove posso trovare il codice di questo oggetto?
    A occhio, la classe SqlHelper ti fornisce i metodi per interfaciare la tua logica alla base di dati, e quindi ingloba le operazioni CRUD.
    Generalmente, non si consente di creare istanze della classe in questione, ma ci si limita a definire, al suo interno, una serie di metodi contrassegnati come static:

    Esempio:

    codice:
    internal sealed class SqlHelper
    {
    	private DataHelper() {}
    
    	internal static string ConnectionString
    	{
    		get{ return ConfigurationManager.AppSettings["ConnectionString"]; }
    	}
    
    	internal static SqlDataReader ExecuteReader(CommandType cmdType, string cmdText, params SqlParameter[] cmdParams)
    	{
    		SqlDataReader result = null;
    		SqlCommand cmd = new SqlCommand();
    			
    		try
    		{
    			cmd.Connection = new SqlConnection(SqlHelper.ConnectionString);
    			cmd.CommandText = cmdText;
    			cmd.CommandType = cmdType;
    
    			// Se sono presenti dei parametri, gli aggiungo all'oggetto SqlCommand
    			if(cmdParams != null)
    				for(int i = 0; i < cmdParams.Length; i++)
    					if(sqlParams[i] != null)
    					{
    						if(sqlParams[i].Value == null)
    							sqlParams[i].Value = DBNull.Value;
    
    						cmd.Parameters.Add(sqlParams[i]);
    					}
    
    			// Una volta configurati tutti i parametri, posso chiamare il metodo ExecuteReader
    			result = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    
    			// Pulitura dei parametri
    			cmd.Parameters.Clear();
    		}
    		catch
    		{
    			// Gestione dell'eccezione
    		}
    
    		return result;
    	}
    
    	// Altri metodi Helper
    	// ...
    	// ...
    }
    
    
    public class WebUtentiData
    {
        public WebUtentiCollection GetAll()
        {
            WebUtentiCollection utenti = new WebUtentiCollection();
    
            SqlDataReader dr = SqlHelper.ExecuteReader(CommandType.Text, "SELECT * FROM titles", null);
    
    	if(dr != null)
                while (dr.Read())
                {
                    WebUtente utente = new WebUtente();
    
                    utente.Nome = !dr.IsDBNull(0) ? dr.GetString(0) : String.Empty;
                    utente.Cognome = !dr.IsDBNull(1) ? dr.GetString(2) : String.Empty;
                    utente.Mail = !dr.IsDBNull(3) ? dr.GetString(3) : String.Empty;
    
                    utenti.Add(utente);
                }
    
            return utenti;
        }
    }
    Originariamente inviato da Valeria75_bis
    2) la mia collection è vuota ....
    Beh, devi implementare i metodi che ritieni possano risultarti utili.
    Credo che, per iniziare, l'utilizzo di una Generic nuda e cruda possa già fare al caso tuo.
    In futuro, puoi affinarla come meglio credi.

    Originariamente inviato da Valeria75_bis 3) nella classe utentiManager, perchè per accedere agli elementi della collection devo fare [i].NomeCampo
    Il tipo List<T>, che per quello che vuoi fare tu è fin troppo ricco, non corrisponde altro che all'ArrayList, ma nel caso delle Generics risulta tipizzato.

    Originariamente inviato da Valeria75_bis (inoltre è giusta la collection come l'ho creata io (ovvero vuota)??? vedi punto 2.)
    Certamente.
    In questo modo eviti riferimenti a null.
    A tal proposito ti consiglio di creare anche dei "casi speciali" per le tue entities, sempre per le ragioni che ti ho appena esposto.

    Originariamente inviato da Valeria75_bis 4) cosa devo inserire nella classe WebUtentiManager?? Se nella classe Data gestisco le interrogazioni al DB, nel Manager dovrei gestire la logica di business .... a livello teorico mi è chiaro, ma a livello pratico non saprei cosa gestire in questa classe, potreste farmi un semplice esempio pratico di implementazione all'interno del manager?
    In effetti, il modo in cui hai scritto la classe WebUtentiData non ha molto senso.
    Per come hai strutturato tu la logica di accesso ai dati, la classe WebUtentiManager non ha senso di esistere in quanto mi è sufficiente istanziare la classe WebUtentiManagerData e chiamare il metodo GetAll().
    Quindi, nel tuo caso, non vi è un unico punto di accesso, come si converrebbe ad ogni architettura n-tier.

    Originariamente inviato da Valeria75_bis 5) più che un dubbio è un consiglio: l'uso del datareader per accedere ad una SELECT * è corretto?? Oppure esiste una soluzione piu "performante" per records di grandi dimensioni?
    Il DataReader va benissimo.
    Per le "grosse dimensioni", si può prevedere una paginazione dei risultati lato server.
    Nicola Baldi <% Naighes %>
    Il mio blog!

    "Non hai veramente capito qualcosa fino a quando non sei in grado di spiegarlo a tua nonna."

  5. #5

    Re: Re: Applicazione n-tier ho letto miiiiiille esempi e ci ho provato ... mi restano alcuni

    Originariamente inviato da naighes
    In effetti, il modo in cui hai scritto la classe WebUtentiData non ha molto senso.
    Per come hai strutturato tu la logica di accesso ai dati, la classe WebUtentiManager non ha senso di esistere in quanto mi è sufficiente istanziare la classe WebUtentiManagerData e chiamare il metodo GetAll().
    Quindi, nel tuo caso, non vi è un unico punto di accesso, come si converrebbe ad ogni architettura n-tier.
    Per come la vedo io, non e' vero quello che dici. La classe WebUtentiManager rappresenta in parte la business logic che puo' capitare abbia poca logica e si limiti a chiamare il livello piu' in basso di accesso ai dati vero e proprio che in questo caso puo' essere rappresentato dalla classe WebUtentiData.
    Saluti a tutti
    Riccardo

  6. #6
    per completezza ecco il link del data access application block di microsoft che e' una libreria molto utile per evitarci operazioni ripetitive in maniera affidabile e completa

    http://msdn2.microsoft.com/en-us/library/aa480458.aspx
    Saluti a tutti
    Riccardo

  7. #7

    Re: Re: Re: Applicazione n-tier ho letto miiiiiille esempi e ci ho provato ... mi restano alcuni

    Originariamente inviato da riccardone
    Per come la vedo io, non e' vero quello che dici. La classe WebUtentiManager rappresenta in parte la business logic che puo' capitare abbia poca logica e si limiti a chiamare il livello piu' in basso di accesso ai dati vero e proprio che in questo caso puo' essere rappresentato dalla classe WebUtentiData.
    In parte, quello che dici è corretto.
    Il problema, nel caso del codice postato da Valeria, è proprio strutturale.

    La domanda, alla fine, è semplice.
    Perchè dovrei scrivere ulteriore codice se già il codice che ho mi mi fornisce un vero e proprio Entry Point per il Data Abstraction Layer?

    Quello che dici, riccardone, ha un senso, perchè una maggiore stratificazione della logica comporta molti vantaggi, ma non come ha fatto la nostra Valeria.
    Il problema rimane sempre quello di garantire un unico punto di accesso al Data Abstraction Layer.

    Per esempio:

    codice:
    public sealed class WebUtentiData
    {
         internal IList<IEntityContract> Read()
         {
              WebUtentiCollection items = new WebUtentiCollection();
    
              // ...
    
              return items;
         }
         
         internal IEntityContract Read(params object[] identifiers)
         {
              MyType item = new MyType();
    
              // ...
    
              return item;
         }
    
         // ...
    }
    A questo punto, posso implementare la classe WebUtentiManager e in questo modo è sensato.

    codice:
    public class WebUtentiManager
    {
         private WebUtentiData m_data = null;
    
         public NewsItemManager()
         {
              m_data = new WebUtentiData();
         }
    
         public WebUtentiCollection Read()
         {
              return (WebUtentiCollection)m_data.Read();
         }
    
         // ...
    }
    Tutto questo a grandi linee...
    Ovvio che si può arricchire ulteriormente e abbondantemente!
    Nicola Baldi <% Naighes %>
    Il mio blog!

    "Non hai veramente capito qualcosa fino a quando non sei in grado di spiegarlo a tua nonna."

  8. #8

    Re: Re: Re: Re: Applicazione n-tier ho letto miiiiiille esempi e ci ho provato ... mi restano alcuni

    Originariamente inviato da naighes
    Il problema, nel caso del codice postato da Valeria, è proprio strutturale.
    non vedo problemi strutturali e neanche particolari differenze rispetto alle varianti che hai postato tu.

    La domanda, alla fine, è semplice.
    Perchè dovrei scrivere ulteriore codice se già il codice che ho mi mi fornisce un vero e proprio Entry Point per il Data Abstraction Layer?
    Non capisco cosa intendi con "vero e proprio Entry Point per il Data Abstraction Layer".
    Avere uno strato di logica nel quale non vi sia nemmeno l'ombra di accesso ai dati, e da questo istanziare quando serve (o sin dall'inizio come hai fatto tu) il dal risponde ad una precisa esigenza architetturale.
    Saluti a tutti
    Riccardo

  9. #9

    Re: Re: Re: Re: Re: Applicazione n-tier ho letto miiiiiille esempi e ci ho provato ... mi restano al

    Originariamente inviato da riccardone
    Non capisco cosa intendi con "vero e proprio Entry Point per il Data Abstraction Layer".
    Avere uno strato di logica nel quale non vi sia nemmeno l'ombra di accesso ai dati, e da questo istanziare quando serve (o sin dall'inizio come hai fatto tu) il dal risponde ad una precisa esigenza architetturale.
    Ti faccio un esempio concreto.
    Tu, sviluppatore, ti occupi di implementare la Business Logic di un'applicazione e realizzi il codice che ha postato Valeria.
    A quel punto, ti generi l'assembly e lo consegni a "Mario Rossi", che dovrà sviluppare il Front-End applicativo.
    Mario Rossi vuole popolare un controllo Gridview con gli utenti registrati al sito.
    All'interno dell'assembly che tu gli hai consegnato, lui trova due classi:

    1) WebUtentiData
    2) WebUtentiManager

    Noterà che, entrambe le classi, forniscono un metodo GetAll() che restituisce una collection di oggetti WebUtente.
    Prova a popolare il GridView utilizzando entrambe le classi e noterà che il risultato che ottiene è lo stesso.
    Sicuramente, a quel punto, ti chiamerà, e ti chiederà quale differenza esista tra le due classi.
    Tu cosa gli risponderai?

    Nel caso del codice che ti ho proposto io, invece, il sig. Mario Rossi non ti chiamerà, perchè sarà obbligato ad utilizzare la classe WebUtentiManager.
    Il metodo Read(params object[] identifiers) restituisce un oggetto IEntityContract che, nel mio caso, è l'interfaccia che implementano tutte le Entities.
    E' questo che intendo per "unico punto di accesso al "DAL".

    Per avere un'idea di quello che voglio dire, scaricati il seguente esempio:
    http://www.dotnetcircle.it/demo/fire...House.Code.zip

    Spero di esserti stato di aiuto.
    Nicola Baldi <% Naighes %>
    Il mio blog!

    "Non hai veramente capito qualcosa fino a quando non sei in grado di spiegarlo a tua nonna."

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072
    Grazie a tutti per l'aiuto!

    Ho qualche dubbio in merito alle risposte

    Cosa intendi per "arricchirle" in
    << Per quello che riguarda le Entity e le Collection credo che tu sia sulla strada giusta, anche se credo che dovresti ulteriormente arricchirle. >>


    Beh, devi implementare i metodi che ritieni possano risultarti utili.
    Credo che, per iniziare, l'utilizzo di una Generic nuda e cruda possa già fare al caso tuo.
    In futuro, puoi affinarla come meglio credi.
    Quindi anche cosi va bene, ma un esempio di quello che potrei inserire (in futuro) in questa collection quale potrebbe essere?



    A tal proposito ti consiglio di creare anche dei "casi speciali" per le tue entities, sempre per le ragioni che ti ho appena esposto.
    Cosa intendi per "casi speciali"?


    In effetti, il modo in cui hai scritto la classe WebUtentiData non ha molto senso.
    Per come hai strutturato tu la logica di accesso ai dati, la classe WebUtentiManager non ha senso di esistere in quanto mi è sufficiente istanziare la classe WebUtentiManagerData e chiamare il metodo GetAll().
    Quindi, nel tuo caso, non vi è un unico punto di accesso, come si converrebbe ad ogni architettura n-tier.

    Ma nell'esempio che ho trovato c'era proprio questa WebUtentiManager... quello che vorrei capire è quello che dovrei inserire qui dentro :-(( (anche per il futuro, quando la logica si complicherà)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.