Si potrebbe suppore che in un applicazione Web torni decisamente utile sapere sia dove ci si trova, fisicamente sia logicamente.
E' pur vero che si possa utilizzare una variabile di sessione o un parametro di configurazione a cui accedere liberamente, ma non sempre è così.
In asp.Net possiamo trovare due comodi operatori Server.MapPath() e "~", che sono indispensabili o quasi in tutte le applicazioni web.
Supponiamo di avere un applicazione con larga scala di distribuzione, questa deve essere :
Semplice
Facilmente Configurabile
Decisamente MOLTO fruibile.
Questi pochi termini implicano che il "mazzo" che si deve fare lo sviluppatore è davvero enorme.
Con semplice Si intende che qualsiasi tipo di utente deve potere essere nella condizione di installare e agire sul prodotto.
Non con i classici Wizard di Start up che una volta usati scompaiono... e chi si è visto si è visto...
Questo implica che Facilmente Configurabile è la possibilità di intervenire sul prodotto Tempestivamente per modficarne la configurazione e non "disinstalla tutto fai 300 backup... e spera".
Con decisamente molto fruibile intendo che l'applicazione ovunque essa sia possa essere modificata in toto o quasi.
A tal proposito è di fondamentale importanza partire con una struttura di configurazione ben strutturata.
E' possibile usare una classe che mantenga viva la configurazione del sito sempre... o fino a quando non scade la sessione.
Dal mio canto mi trovo comodo a rimmapare qualcosa come
string SiteVirtualRootPath = "~";
string SiteRealRootPath = Server.MapPath("~");
in questo modo posso richiedere al mio Configuration Provider come e quando voglio il dove e come sono.
Think about, case study, implementation... Pensieri, casi di studio e implementazioni, tutto quello che devo affrontare lavorando in c#.
giovedì 14 maggio 2009
mercoledì 13 maggio 2009
Non andiamo molto bene....

Come sempre mi trovo ad affrontare cose mai viste.... ma questa le batte davvero tutte.
Sembrerebbe che si verifichi un eccezione in SYSTEM.XML.DLL, e va bene ma dato che sfrutto la libreria, invocando la chiamata all'interno di un try catch mi aspetto che sia il mio codice a gestirlo... ma qualcosa non va.
Quando si verifica questa schifezza...
Semplice quanto state cercando di serializzare un file xml che non contiene elementi.. più o meno qualcosa di simile a
questo:
Che cosa si può fare per evitare un problema simile ???utilizzando un piccolo "trucco" verificando che la lunghezza del file sia consona con almeno un elemento...
cmq... non andiamo bene. Se un applicativo non riesce a rilasciare la gestione di un eccezione .. e perchè già al suo interno
non è gestita..
ahi ahi ahi !!
lunedì 16 marzo 2009
Web Control .. no Span
Perchè arrabbiarsi quando non è il caso di farlo ?
Il web control, se usato bene, è uno strumento potente e affidabile, ma ha i suo oscuri limiti. Il primo fra tutti e che annida tutto quello che avete implementato in uno span.
Chiaramente c'e' qualcosa che non va. Ma per tutto c'e' una spiegazione, efficente o meno.
Lo span <>testo non è altro che il tag individuato come base. Appare evidente che un tag di questo tipo non ha grande scopo ne tanto meno possa esprimere vere potenzialità.
Per implementare un web control che ne meriti di diritto il valore bisogna tuttavia partire da un controllo più concreto che un semplice span.
se da così ...
public class LoginPanel : WebControl
si passa a così ...
public class LoginPanel : Panel
Si ottiene un output sicuramente differente, il tag span scompare...
Per ogni soluzione è necessario individuare le grandezze che ne sono coinvolte, implementare un Web Control, ha i suoi benefici è può sicuramente essere riutilizzato, ma potrebbe anche essere eccessivo.
Il web control, se usato bene, è uno strumento potente e affidabile, ma ha i suo oscuri limiti. Il primo fra tutti e che annida tutto quello che avete implementato in uno span.
Chiaramente c'e' qualcosa che non va. Ma per tutto c'e' una spiegazione, efficente o meno.
Lo span <>testo non è altro che il tag individuato come base. Appare evidente che un tag di questo tipo non ha grande scopo ne tanto meno possa esprimere vere potenzialità.
Per implementare un web control che ne meriti di diritto il valore bisogna tuttavia partire da un controllo più concreto che un semplice span.
se da così ...
public class LoginPanel : WebControl
si passa a così ...
public class LoginPanel : Panel
Si ottiene un output sicuramente differente, il tag span scompare...
Per ogni soluzione è necessario individuare le grandezze che ne sono coinvolte, implementare un Web Control, ha i suoi benefici è può sicuramente essere riutilizzato, ma potrebbe anche essere eccessivo.
mercoledì 4 marzo 2009
Optional Attribute C#
Come posso implementare un Attributo Opzionale in una firma di un metodo ?
In C# è concettualmente difficile pensare ad una forma opzionale, ma chi arriva da VB, qualche domanda se la pone, probabilmente perchè può ancora ritenere che un parametro sia e rimanga un entità FLUTTUANTE.
Supponiamo di trovarci nella situazione di dover implementare noi un parametro opzionale.
Firma
private void Foo(string param1, string param2)
{
if ( param1 == null) {param1 ="";}
if ( param2 == null) {param2 ="";}
// resto del codice...
}
Chiamata
Foo("A","b")
Oppure
Foo("A",null)
Tecnicamente funziona, e non ci fa perdere troppo tempo.
Possiamo però trovarci nella spiacevole situazione di dover effettuare una chiamata ad un metodo già esistente non implementato da noi ...
SampleFoo sf = new SampleFoo();
sf.DoFooFoo(param1, param2);
Possiamo .. e per fortuna estendere SampleFoo e trasformare il nostro metodo sperando che tutto vada... perchè
del codice altri non v'e' certezza...
public class MyFooFoo :SampleFoo();
public void new DoFooFoo(string param1, string param2)
{
if ( param1 == null) {param1 ="";}
if ( param2 == null) {param2 ="";}
base.DoFooFoo ( param1, param2 );
}
Ed ecco fatto ..
Come sempre va data la giusta considerazione se stiamo creando una funzione per cui un parametro ci sembra o ci può sembrare opzionale.. probabilmente non stiamo considerando il fatto che si possano creare degli override... il che
sarebbe anche meglio.
Foo(string param1)
Foo(string param1, string param2)
Foo(string[] params)
Cmq.. anche questa è andata.
In C# è concettualmente difficile pensare ad una forma opzionale, ma chi arriva da VB, qualche domanda se la pone, probabilmente perchè può ancora ritenere che un parametro sia e rimanga un entità FLUTTUANTE.
Supponiamo di trovarci nella situazione di dover implementare noi un parametro opzionale.
Firma
private void Foo(string param1, string param2)
{
if ( param1 == null) {param1 ="";}
if ( param2 == null) {param2 ="";}
// resto del codice...
}
Chiamata
Foo("A","b")
Oppure
Foo("A",null)
Tecnicamente funziona, e non ci fa perdere troppo tempo.
Possiamo però trovarci nella spiacevole situazione di dover effettuare una chiamata ad un metodo già esistente non implementato da noi ...
SampleFoo sf = new SampleFoo();
sf.DoFooFoo(param1, param2);
Possiamo .. e per fortuna estendere SampleFoo e trasformare il nostro metodo sperando che tutto vada... perchè
del codice altri non v'e' certezza...
public class MyFooFoo :SampleFoo();
public void new DoFooFoo(string param1, string param2)
{
if ( param1 == null) {param1 ="";}
if ( param2 == null) {param2 ="";}
base.DoFooFoo ( param1, param2 );
}
Ed ecco fatto ..
Come sempre va data la giusta considerazione se stiamo creando una funzione per cui un parametro ci sembra o ci può sembrare opzionale.. probabilmente non stiamo considerando il fatto che si possano creare degli override... il che
sarebbe anche meglio.
Foo(string param1)
Foo(string param1, string param2)
Foo(string[] params)
Cmq.. anche questa è andata.
martedì 3 marzo 2009
Add per la IDE 2005....
Siamo sicuri che funziona tutto ma proprio tutto ??
Provate a fare questo Esperimento.
Create un AddIn (fra i progetti dell'IDE o Extensibility)
Datagli come nome My.Addin
Selezionate le opzioni per:
Due appunti di viaggio ...
Il primo vi viene recapitata un' eccezione, ma molto forviante
ARGUMENT EXCEPTION e la prima cosa a cui si può pensare e che per un motivo o per l'altro non sia avvenuto il
caricamento del nuovo "comando"
La seconda e che spulciando fra glie elementi nella firma si scopre che
_addInInstance ... ha generato un eccezione ( differente dalla precedente... )
Nel dubbio dopo "parecchie parole offensive nei confronti dell'ide" scopro che ... l'addin c'e' è caricandolo non va lo stesso !!
Il problema è il "." ossia aggiungendo il punto il compilatore va a cercare una libreria che per lui non esiste..
Ci sarà un sistema per risolvere questo "possibile" baco ??
si semplice siate disordinati .. mettete pure dei nomi a caso .. e probabilmente il vostro add in andrà !
Provate a fare questo Esperimento.
Create un AddIn (fra i progetti dell'IDE o Extensibility)
Datagli come nome My.Addin
Selezionate le opzioni per:
- Aggiungere l'addin al menu Tools
- Aggiungere l'addin all'avvio
Due appunti di viaggio ...
Il primo vi viene recapitata un' eccezione, ma molto forviante
ARGUMENT EXCEPTION e la prima cosa a cui si può pensare e che per un motivo o per l'altro non sia avvenuto il
caricamento del nuovo "comando"
La seconda e che spulciando fra glie elementi nella firma si scopre che
_addInInstance ... ha generato un eccezione ( differente dalla precedente... )
Nel dubbio dopo "parecchie parole offensive nei confronti dell'ide" scopro che ... l'addin c'e' è caricandolo non va lo stesso !!
Il problema è il "." ossia aggiungendo il punto il compilatore va a cercare una libreria che per lui non esiste..
Ci sarà un sistema per risolvere questo "possibile" baco ??
si semplice siate disordinati .. mettete pure dei nomi a caso .. e probabilmente il vostro add in andrà !
lunedì 2 marzo 2009
Campi di una tabella .. tipo ... e chiave primaria.
Come posso ottenere tutti i campi di una tabella con l'evidenza del campo chiave?
A molti di noi sarà capitato in più di un occasione la necessità di individuare tutti i campi di una tabella, un po per creare uno statement in automatico, un po' per analisi di Db che non abbiamo disegnato noi.
Nel mio caso sto realizzando un piccolo prodotto che crea soluzioni a pacchetto partendo da un db è va tutto bene fino a che non si impatta con le Query.. e non tanto con le SELECT .. ma con le UPDATE o con le DELETE.
Mi sono quindi domandato fino a che punto spingermi nell'implementazione... arrivando alla soluzione, che
"IO PREMO UN TASTO... LUI FA' IL 90% DEL COMPITO".
Quindi torniamo a bomba sulla query , ci servono:
la seconda contiene i nomi delle constraint..
la terza (a me sembra una estensione della seconda)
Dalla prima recuperiamo le colonne contenenti Nome e Tipo
Dalla seconda e dalla terza recuperiamo se è un identity
Ma chiaramente mettendole in Join .. ci perdiamo tutti i campi che non lo sono ..
Quindi ci basta fare una piccola Union con gli SCARTATI...
ed ecco che cosa ne viene fuori ..
select
m.column_name,
m.data_type,
x.CONSTRAINT_TYPE
from
INFORMATION_SCHEMA.COLUMNS m,
(select
CONSTRAINT_TYPE,column_name
from
INFORMATION_SCHEMA.TABLE_CONSTRAINTS a,
INFORMATION_SCHEMA.KEY_COLUMN_USAGE b
where
a.table_name = '[tbName]'
and
b.CONSTRAINT_NAME = a.CONSTRAINT_NAME) AS x
where
m.table_name = '[tbName]'
and
x.column_name = m.column_name
UNION
select
m.column_name,
m.data_type,
' '
from
INFORMATION_SCHEMA.COLUMNS m,
(select
CONSTRAINT_TYPE,column_name
from
INFORMATION_SCHEMA.TABLE_CONSTRAINTS a,
INFORMATION_SCHEMA.KEY_COLUMN_USAGE b
where
a.table_name = '[tbName]'
and
b.CONSTRAINT_NAME = a.CONSTRAINT_NAME) AS x
where
m.table_name = '[tbName]'
and
x.column_name <> m.column_name
Provare per credere...
Questà può essere eseguita come sqlCommand da un qualsiasi dataAdapter ed il contenuto può agevolmente essere messo
in una dataTable..
Bhe buon divertimento
A molti di noi sarà capitato in più di un occasione la necessità di individuare tutti i campi di una tabella, un po per creare uno statement in automatico, un po' per analisi di Db che non abbiamo disegnato noi.
Nel mio caso sto realizzando un piccolo prodotto che crea soluzioni a pacchetto partendo da un db è va tutto bene fino a che non si impatta con le Query.. e non tanto con le SELECT .. ma con le UPDATE o con le DELETE.
Mi sono quindi domandato fino a che punto spingermi nell'implementazione... arrivando alla soluzione, che
"IO PREMO UN TASTO... LUI FA' IL 90% DEL COMPITO".
Quindi torniamo a bomba sulla query , ci servono:
- INFORMATION_SCHEMA.COLUMNS
- INFORMATION_SCHEMA.TABLE_CONSTRAINTS
- INFORMATION_SCHEMA.KEY_COLUMN_USAGE
la seconda contiene i nomi delle constraint..
la terza (a me sembra una estensione della seconda)
Dalla prima recuperiamo le colonne contenenti Nome e Tipo
Dalla seconda e dalla terza recuperiamo se è un identity
Ma chiaramente mettendole in Join .. ci perdiamo tutti i campi che non lo sono ..
Quindi ci basta fare una piccola Union con gli SCARTATI...
ed ecco che cosa ne viene fuori ..
select
m.column_name,
m.data_type,
x.CONSTRAINT_TYPE
from
INFORMATION_SCHEMA.COLUMNS m,
(select
CONSTRAINT_TYPE,column_name
from
INFORMATION_SCHEMA.TABLE_CONSTRAINTS a,
INFORMATION_SCHEMA.KEY_COLUMN_USAGE b
where
a.table_name = '[tbName]'
and
b.CONSTRAINT_NAME = a.CONSTRAINT_NAME) AS x
where
m.table_name = '[tbName]'
and
x.column_name = m.column_name
UNION
select
m.column_name,
m.data_type,
' '
from
INFORMATION_SCHEMA.COLUMNS m,
(select
CONSTRAINT_TYPE,column_name
from
INFORMATION_SCHEMA.TABLE_CONSTRAINTS a,
INFORMATION_SCHEMA.KEY_COLUMN_USAGE b
where
a.table_name = '[tbName]'
and
b.CONSTRAINT_NAME = a.CONSTRAINT_NAME) AS x
where
m.table_name = '[tbName]'
and
x.column_name <> m.column_name
Provare per credere...
Questà può essere eseguita come sqlCommand da un qualsiasi dataAdapter ed il contenuto può agevolmente essere messo
in una dataTable..
Bhe buon divertimento
mercoledì 18 febbraio 2009
Thema e Custom Web Control.
Vi sarà captitato di affrontare il traumatico discroso di associare un tema ad un castom web control... si tratta di un qualcosa di assurdo e decisamente complesso soprattutto dal punto di vista della comprensione.
Poniamo l'esempio:
public class bPanel : Panel
{
public ovveride SkinID
{get{return base.SkinId;} set {base.SkinId = value;}}
public ovveride CssClass
{get{return base.CssClass;} set {base.CssClass = value;}}
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
}
}
Non c'e' che dire non si tratta di una gran classe, ma questo è quanto basta
implementare per il nostro esempio.
Nella vostra pagina.. serve
<%@ Register Assembly="Miei.UI.WebControls" Namespace="Miei.UI.WebControls" TagPrefix="cc1" %>
e naturalmente
< id="bPanel1" runat="server" skinid="bPanel1">
Ora spostiamoci nel file del tema ...
MioTema.skin
e ri registriamo il controllo
<%@ Register Assembly="Miei.UI.WebControls" Namespace="Miei.UI.WebControls" TagPrefix="cc1" %>
< id="bPanel1" runat="server" skinid="bPanel1">
ed ora skinniamo come più ci piace..
< skinid="bPanel1" cssclass="laClasse" runat="server" backimageurl="img/MioSfondo.jpg" height="21px" width="100%">
sul web non c'e' scritto molto a riguardo, spero quindi che possa essere utile
Poniamo l'esempio:
public class bPanel : Panel
{
public ovveride SkinID
{get{return base.SkinId;} set {base.SkinId = value;}}
public ovveride CssClass
{get{return base.CssClass;} set {base.CssClass = value;}}
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
}
}
Non c'e' che dire non si tratta di una gran classe, ma questo è quanto basta
implementare per il nostro esempio.
Nella vostra pagina.. serve
<%@ Register Assembly="Miei.UI.WebControls" Namespace="Miei.UI.WebControls" TagPrefix="cc1" %>
e naturalmente
< id="bPanel1" runat="server" skinid="bPanel1">
Ora spostiamoci nel file del tema ...
MioTema.skin
e ri registriamo il controllo
<%@ Register Assembly="Miei.UI.WebControls" Namespace="Miei.UI.WebControls" TagPrefix="cc1" %>
< id="bPanel1" runat="server" skinid="bPanel1">
ed ora skinniamo come più ci piace..
< skinid="bPanel1" cssclass="laClasse" runat="server" backimageurl="img/MioSfondo.jpg" height="21px" width="100%">
sul web non c'e' scritto molto a riguardo, spero quindi che possa essere utile
Iscriviti a:
Post (Atom)