Dopo anni di forzata attenzione quasi esclusiva verso il mondo web, mi ritrovo (finalmente) a dover gestire e pianificare una GUI WinForm o WPF, ancora non si sa, connessa al back-end nella stessa intranet e con autenticazione Windows.
L'applicazione avrà comunque anche una view web ed utilizzo un MVP, seppur non rigorosamente "puro".
Il grosso problema è che, rispetto a qualche anno fa, parecchie cose sono cambiate nel mio approccio: non utilizzavo un presentation layer, non esisteva WCF (o era appena uscito?), non gestivo il contesto di persistenza, ecc. e quindi mi ritrovo a riaffrontare da zero il problema, ovviamente facendo in modo che non "cozzi" con l'architettura attuale e che non sia "inutilmente complesso".
Accantonato, per ora, Remoting (senza un vero motivo, solo perchè WCF è più recente) mi sono basato sul suo "erede" WCF utilizzando netTcpBinding e clientCredentialType="Windows" per la sicurezza basata sul messaggio. Mi sono inoltre informato sull'utilizzo dei callbacks per ottenere la dependency injection.
Non sono riuscito però ad ottenere il "trasporto degli oggetti" (!= SOA, chiaro), nel senso che posso utilizzare la sessione client/server, ma non sono riuscito a trasportare "di là" un oggetto e riportarlo "di quà" in modo che originalInstance == returnedInstance, tanto per capirci. ;-)
Ergo, prima domanda di carattere generale: esiste una configurazione di WPF che permetta il trasporto di oggetti utilizzando Windows authentication?
Passiamo oltre... (Adesso faccio collassare qualcuno! :-p)
Qualche anno fa, prima di essere "risucchiato" da ASP.NET, avevo postato qui in merito all'idea di lasciare solo la view lato client e di conseguenza il presentation lato server. Praticamente tutti quelli che hanno risposto non erano favorevoli, ma parlandone poi off-line l'idea non è sembrata poi così improponibile e quindi mi trovo a riprendere il "brainstorming" dove l'avevo interrotto.
All'apertura della view, quindi, questa potrebbe collegarsi al servizio del suo presenter iniettando la propria istanza come oggetto di callback, sfruttando eventualmente anche gli eventi.
Utilizzando però un MVP non "puro" le mie view attuali conoscono e sanno manipolare le entità del Domain Model (per esempio, in fase di creazione di una nuova entità, la view riceve la relativa nuova istanza vuota dal presenter e la idrata con i dati presenti nei controlli) e quindi in questo caso:
Inutile dire che la seconda possibilità introduce codice e complessità da gestire e manutenere, quindi sto cercando di capire se esista una terza soluzione al problema.
Che ne dite? Ho solo bisogno di una vacanza? :-)
Grazie, ciao!
Ciao Mauro,
Tutta la vita MVC, non necessariamente Asp.net mvc piuttosto MVC come pattern perch� MVP su un'applicazione web � proprio ostico.
Orpolo... io con l'MVP in salsa "Duz" di cui avevo postato un primo brainstorming sul blog mi sono trovato benissimo ed anche chi ha dovuto sorbirselo :-) non ha disdegnato (almeno che io sappia! :-D).
> in modo che originalInstance == returnedInstance, tanto per capirci. ;-)
non se po' fa
Grazie :-(
> Ergo, prima domanda di carattere generale: esiste una configurazione di WPF > che permetta il trasporto di oggetti utilizzando Windows authentication?
credo tu intenda Wcf, ma non capisco lo stesso la domanda.
Yep... lapsus! Cmq era la domanda a cui hai risposto prima! ;-)
non � che abbia capito molto :-), ma se il target � Wpf molla MVP e buttati su M-V-VM e vedrai che il tuo approccio cambier� radicalmente (in meglio).
Mi dispiace non essere riuscito a spiegarmi... Grazie cmq per esserti letto il mappazzo! ;-)Cmq avendo anche una view web preferisco evitare in questo caso MVVM (a meno di non prevedere un presentation specifico per ogni view, che personalmente escludo a priori).
Proverò a prototipare con i proxy per vedere "quanto fa male"!
Ciao!
Mario
questo secondo me � mandatory :-) � impensabile riutilizzare, senza piangere in cinese, lo stesso presentation pattern per teconologie radicalmente diverse
beh, non sono molto d'accordo su "impensabile"... cmq magari avremo modo di confrontarci sull'argomento.
Scusa, tornado all'argomento iniziale, quindi tu come imposti la classica client/server intranet con autenticazione integrata? Una SOA con View e Presentation sul client ed il resto lato server con un metodo/operation per ogni caso d'uso nel BizLayer ed un DTO per ogni caso d'uso che lo richiede?
:-)
Ok, quindi: o compro un libro di ricette, o cerco la ricetta su Google, o proseguo con la mia vecchia ricetta.
Personalmente uso questa struttura
Entity che costituiscono il dominio.
Una serie di funzioni di servizio che presentano la logica di business in salsa "Transaction script", ovvero una funzione per ogni macrooperazione es
OrderService.CreateOrder(Date, Lines, etc)
Queste funzioni tornao sempre dei dto, che genero con un generatore t4 cosi non fatico.
Il chiamante, quando deve usare un order service semplicemente lascia risolvere l'interfaccia IORderService dal motore di Ioc. A seconda del file di configurazione ottiene la classe o un wrapper per wcf, cosi se non mi serve non scomodo wcf, ma se mi serve lo posso usare senza trppo infierire sull'architettura.
Detto questo le UI sono tutte mvc, ma tra mvc in winfrom e mvvm su wpf ce ne corre, per cui ogni ui ha solitamente un ulteriore layer che adatta il tutto, sempre basandosi sui servizi.
Es. il web non fa altro che creare degli oggetti ObjectdataSource friendly che internamente delegano ai servizi.
WPF si mangia tutto, con le capacità di binding che ha tiro su pezzi di grafo oggetti e li bindo
Winform è un po più limitato, mi creo dei dto aposit.
E più o meno sopravvivo allegramente
:)
--Blog Eng: http://www.codewrecks.com/blogBlog Ita: http://blogs.ugidotnet.org/rgmTwitter: http://twitter.com/alkampfer
Ciao Alk, grazie.
Mi sembra a grandi linee quello che immaginavo, giusto?
> Scusa, tornado all'argomento iniziale, quindi tu come imposti la classica > client/server intranet con autenticazione integrata? Una SOA con View e > Presentation sul client ed il resto lato server con un metodo/operation per > ogni caso d'uso nel BizLayer ed un DTO per ogni caso d'uso che lo richiede?
Sto proseguendo con i miei test, valuterò... :-/