Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Modellazione Entità

  1. #1
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202

    Modellazione Entità

    Ciao a tutti,

    Mi sto approcciando ad un applicativo web WebForm con entity framework con approccio codefirst.
    Vi porto un esempio per capire come modellare le classi e metodi secondo la vs. esperienza.
    Mi ritrovo nell'evento di login button click

    codice:
            protected void LoginButton_Click(object sender, EventArgs e)
            {
                GeBBContext db = new GeBBContext();
                User userConnected = db.Users.Where(user => user.UserName == UserName.Text).FirstOrDefault();
    
                if (userConnected == null) {
                    FailureText.Text = "Utente o Password non corretti";
                }
                else
                {
                    if (userConnected.Password == User.EncryptPassword(Password.Text)) {
                        if (userConnected.PasswordExpired <= DateTime.Now)
                        {
                            Response.Redirect("ChangePassword.aspx");
                        }
                        else
                        {
                            Response.Redirect("Index.aspx");
                        }
                    }
                    else
                    {
                        FailureText.Text = "Utente o Password non corretti";
                    }
                }
            }
    Da quanto ho imparato la logica mi suggerisce di creare il dbContext all'evento e poi tramite linkq recuperare un utente data lo username.

    poi sempre all'interno del bottone creare la logica di autenticazione.

    Secondo voi serebbe stato meglio creare un metodo all'interno della classe user "autentica" passando user e password inseriti e restituire qualcosa?
    Oppure secondo voi è l'approccio giusto.
    Che mestiere difficile.....essere da soli ancora di più

  2. #2
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,521
    Quote Originariamente inviata da Fractals87 Visualizza il messaggio
    Ciao a tutti,

    Mi sto approcciando ad un applicativo web WebForm con entity framework con approccio codefirst.
    Vi porto un esempio per capire come modellare le classi e metodi secondo la vs. esperienza.
    Mi ritrovo nell'evento di login button click

    codice:
            protected void LoginButton_Click(object sender, EventArgs e)
            {
                GeBBContext db = new GeBBContext();
                User userConnected = db.Users.Where(user => user.UserName == UserName.Text).FirstOrDefault();
    
                if (userConnected == null) {
                    FailureText.Text = "Utente o Password non corretti";
                }
                else
                {
                    if (userConnected.Password == User.EncryptPassword(Password.Text)) {
                        if (userConnected.PasswordExpired <= DateTime.Now)
                        {
                            Response.Redirect("ChangePassword.aspx");
                        }
                        else
                        {
                            Response.Redirect("Index.aspx");
                        }
                    }
                    else
                    {
                        FailureText.Text = "Utente o Password non corretti";
                    }
                }
            }
    Da quanto ho imparato la logica mi suggerisce di creare il dbContext all'evento e poi tramite linkq recuperare un utente data lo username.

    poi sempre all'interno del bottone creare la logica di autenticazione.

    Secondo voi serebbe stato meglio creare un metodo all'interno della classe user "autentica" passando user e password inseriti e restituire qualcosa?
    Oppure secondo voi è l'approccio giusto.
    Ciao.
    Dipende... In teoria potrebbe essere corretto utilizzare un metodo di Autenticazione nella classe utente, ma se poi vuoi utilizzare le stesse classi per lavorare in un contesto che non prevede Autenticazione? Oppure la prevede "differente da quella utilizzata e magari non puoi utilizzare gli stessi riferimenti? In quel caso a pare mio sarebbe meglio lasciare più pulite possibili le classi modello che andrai ad utilizzare in altro ambiti, e la parte di Autenticazione lasciarla fuori (legata all'ambito che userai di volta in volta).

  3. #3
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    grazie di avermi risposto, non sai quanto sia difficile trovare su internet info o proposte di questo genere.
    Ponendo di integrare autenticazione nella classe tu cosa avresti fatto?
    Mi spiego, il DBContext lo avresti passato in una proprietà della classe? e poi avresti creato un metodo di autenticazione che prevedeva in input user e password?
    In particolare mi sto riferendo più in generale a tutti quei metodi che prevedo un'estrazione dati dal db... creeresti dei metodi della classe o le faresti esterne da essa?

    Come ultima cosa, hai idea di dove si possano reperire info o visionare situazioni tipiche di approcci reali di programmazione?

    Grazie mille del tuo aiuto
    Che mestiere difficile.....essere da soli ancora di più

  4. #4
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,521
    Quote Originariamente inviata da Fractals87 Visualizza il messaggio
    grazie di avermi risposto, non sai quanto sia difficile trovare su internet info o proposte di questo genere.
    Ponendo di integrare autenticazione nella classe tu cosa avresti fatto?
    Mi spiego, il DBContext lo avresti passato in una propriet� della classe? e poi avresti creato un metodo di autenticazione che prevedeva in input user e password?
    In particolare mi sto riferendo pi� in generale a tutti quei metodi che prevedo un'estrazione dati dal db... creeresti dei metodi della classe o le faresti esterne da essa?

    Come ultima cosa, hai idea di dove si possano reperire info o visionare situazioni tipiche di approcci reali di programmazione?

    Grazie mille del tuo aiuto
    Ciao,
    Forse non ci siamo capiti, io ti suggerivo di non metterlo nella classe utente. In genere quando analizzo un problema scarto subito le soluzioni che risultano meno pratiche delle altre (immagino sia per tutti cos� ), ma questo non toglie che potrebbero anche essere corrette, da qui il mio: "potrebbe essere corretta".
    Personalmente decido l'architettura in base allo scopo finale, per cui sarebbe sbagliato pensare di mettere un metodo prima di darli una precisa funzione all'interno del programma. Login vuol dire tutto e niente...
    Comunque se vuoi provo a fare una forzatura.
    Prova ad immaginare che voglia farmi un programmino in cui mantengo degli account fake o comunque diverse mie utenze web, potrei avere una classe base Utente in cui dichiaro il metodo login e questo magari agisce sul mio account gmail e scarica la posta. Successive derivazioni della classe potrebbero sovrascrivere il metodo login per farlo ad esempio sul sito di terzi. Prova ad immaginare una situazione in cui carico dinamicamente dei plugin esterni che derivano dalla mia classe base, io so solo che nel mio programma dovrò chiamare il metodo login utilizzando l'user e password di quella istanza (creata appunto tramite plugin in base alla discriminante del tipo), a me è trasparente cosa il plugin fa, per cui potrebbe essere molto utile avere un metodo login direttamente nella classe Utente. Ovviamente la stessa classe Utente pu� essere usata per serializzare i dati utente ad esempio con Entity Framework includendola come tipo DbSet in un proprietà di una classe che eredita da Da DbContext.
    Invece tornando al motivo per cui ti suggerivo di non farlo, il punto � che dovresti evitare di mettere riferimenti ad uno o l'altro o gli altri ancora modi di serializzare i dati. Non metterei riferimenti a EF, metti caso che un bel momento decido di scrivere i dati in remoto al posto di usare EF, come potrei fare se ho delle dipendenze ad EF nelle mie classi? diventa un macello, sopratutto se condividi le stesse tra pi� piattaforme come ad esempio Android o IOS che a limite supportano EF con SQLITE, ma non � la stessa cosa...
    Se poi nel tuo caso intendi non riutilizzare il codice, allora tutto ci� non ha molta importanza.

  5. #5
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    Quote Originariamente inviata da U235 Visualizza il messaggio
    Ciao,
    Forse non ci siamo capiti, io ti suggerivo di non metterlo nella classe utente. In genere quando analizzo un problema scarto subito le soluzioni che risultano meno pratiche delle altre (immagino sia per tutti cos� ), ma questo non toglie che potrebbero anche essere corrette, da qui il mio: "potrebbe essere corretta".
    Personalmente decido l'architettura in base allo scopo finale, per cui sarebbe sbagliato pensare di mettere un metodo prima di darli una precisa funzione all'interno del programma. Login vuol dire tutto e niente...
    Comunque se vuoi provo a fare una forzatura.
    Prova ad immaginare che voglia farmi un programmino in cui mantengo degli account fake o comunque diverse mie utenze web, potrei avere una classe base Utente in cui dichiaro il metodo login e questo magari agisce sul mio account gmail e scarica la posta. Successive derivazioni della classe potrebbero sovrascrivere il metodo login per farlo ad esempio sul sito di terzi. Prova ad immaginare una situazione in cui carico dinamicamente dei plugin esterni che derivano dalla mia classe base, io so solo che nel mio programma dovrò chiamare il metodo login utilizzando l'user e password di quella istanza (creata appunto tramite plugin in base alla discriminante del tipo), a me è trasparente cosa il plugin fa, per cui potrebbe essere molto utile avere un metodo login direttamente nella classe Utente. Ovviamente la stessa classe Utente pu� essere usata per serializzare i dati utente ad esempio con Entity Framework includendola come tipo DbSet in un proprietà di una classe che eredita da Da DbContext.
    Invece tornando al motivo per cui ti suggerivo di non farlo, il punto � che dovresti evitare di mettere riferimenti ad uno o l'altro o gli altri ancora modi di serializzare i dati. Non metterei riferimenti a EF, metti caso che un bel momento decido di scrivere i dati in remoto al posto di usare EF, come potrei fare se ho delle dipendenze ad EF nelle mie classi? diventa un macello, sopratutto se condividi le stesse tra pi� piattaforme come ad esempio Android o IOS che a limite supportano EF con SQLITE, ma non � la stessa cosa...
    Se poi nel tuo caso intendi non riutilizzare il codice, allora tutto ci� non ha molta importanza.
    Ok perfetto direi che sei stato molto chiaro.
    Per completezza di mostro il codice del mio dbcontex
    codice:
        public class GeBBContext:DbContext
        {
            public virtual DbSet<User> Users { get; set;}
            public DbSet<UserRole> UserRoles { get; set; }
            public DbSet<Role> Roles { get; set; }
    
            public GeBBContext() : base("GeBB")
            {
                Database.SetInitializer<GeBBContext>(new DropCreateDatabaseIfModelChanges<GeBBContext>());
            }
    
        }
    Ti faccio un esempio su un altro metodo per vedere se l'approccio è corretto.

    Ipotiziamo un metodo della classe user "CreateSession" il quale compito è generare una stringa casuale di connessione.

    codice:
            public bool CreateSession()
            {
                string s = "abcdefghilmnopqrstuvzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
                Random r = new Random();
                StringBuilder sb = new StringBuilder();
                for(int i = 1;i <= 20;i++){
                    sb.Append(s.Substring(r.Next(0, 56), 1));
                }
                Session = sb.ToString();
                LastDataAccess = DateTime.Now;
                HttpContext.Current.Session["idSession"] = Session;
    
                return true;
            }
    il mio codice all'interno dell'evento è :

    userConnected.CreateSession();
    db.SaveChanges();

    Seguento l'approccio che suggerisci è corretto il metodo si occupi di generare la stringa, aggiornare le proprietà, ma NON di aggiornare il db tramite EF.
    (Meglio ancora se portassi fuori il HttpContext.Current.Session["idSession"] = Session
    E proseguendo è corretto che il savechange venga fatto all'esterno del codice.

    Corretto?
    Che mestiere difficile.....essere da soli ancora di più

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2011
    residenza
    Arezzo
    Messaggi
    194
    Secondo me la cosa migliore è che tu racchiuda tutta la logica di interazione diretta con il db in un progetto di API, che poi chiami da qualsiasi punto della tua webapp (e da qualsiasi altra app, mobile o desktop o non so), questo ti permette di essere anche molto più svincolato se domani decidi, per esempio, di usare Angular per il layout, inoltre ti permette di implementare n API che non è detto che tutte le applicazioni possano o richiedano di utilizzare.

    Se inoltre implementi (non è proprio immediato e semplice...) l'architettura DDD (Domain Driven Design) hai praticamente un'applicazione complessa che segue una logica fondamentalmente di MVVM, grandissimo vantaggio nel momento in cui vuoi utilizzare parti esistenti in nuovi progetti
    Riccardo Sadocchi
    Microsoft MCP C#

  7. #7
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,886
    scusa ma perche' tutti questi problemi con il DBContext ? (chiedi se e' il caso di passarlo come parametro)...

    Non e' questo accessibile da qualsiasi punto della solution ?

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 © 2024 vBulletin Solutions, Inc. All rights reserved.