2012-11-23 13 views
6

È possibile creare riferimenti fortemente tipizzati in un web.config o in app.config in modo che la compilazione si interrompa quando tali riferimenti di tipo non sono stati aggiunti al progetto?È possibile creare riferimenti web.config fortemente tipizzati?

Ad esempio, supponiamo di avere un WhizzBangerFactory che si trova nel web.config per WhizzBangers dichiarato. Potrei avere configurazione come,

<whizBangs> 
<add name="SuperDooper" type="MyProject.WhizzBangers.SuperDooperWhizzBanger, MyProject.WhizzBangers" /> 
<add name="Fantastical" type="AnotherProject.WhizzBangers.FantasticalWhizzBanger, AnotherProject.WhizzBangers" /> 
</whizBangs> 

Questo compilerà perfettamente bene, anche se non ci sono riferimenti a MyProject.WhizzBangers andAnotherProject.WhizzBangers. Quello che vorrei è che la build fallisca e mi informi che ho perso i riferimenti.

+0

Mi chiedo se questo può essere raggiunto con strumenti come Resharper? – Mike

+0

Crea un eseguibile che controlli ciò di cui hai bisogno analizzando il tuo file .config o in un altro modo. Chiama questo eseguibile dall'evento Pre-build. –

risposta

1

Il resharper può aiutarti in questo.

distingue visivamente le cose in un web.config in cui il tipo non si fa riferimento (o di aver fatto un errore - in questo esempio ho preso un "t" fuori alla fine della "Microsoft")

enter image description here

Tuttavia, non riesce ancora a compilare, il che è un peccato. Dovrebbe!

+0

Ma questo è il punto in cui non è possibile utilizzare Rue sharper per fallire build automatizzata –

3

Web.config è la sola soluzione di runtime. Per tardi per costruire successo o fallimento.

Se la stessa build crea i tipi a cui si fa riferimento in web.config, analizzare il file web.config per verificare che tutti i file esistano (ciò richiederebbe che tutti i binari necessari per il sito Web finiscano in un directory comune. Per qualcosa come tfs questo sarebbe fatto come una fase di compilazione e solo in caso di successo sono i binari copiati nella directory di rilascio altrimenti la compilazione fallisce

Se gli altri tipi sono forniti da un'altra build e inclusi come parte di un programma di installazione lo stesso tipo di parsing del file di configurazione può essere eseguito come un'app standalone (parte dell'installazione) come controllo di integrità

L'altro modo (sarebbe quello di includere un altro progetto nella tua build che fa riferimento a tutti i tipi di cui potresti aver bisogno, crea un'istanza del tipo in modo che il compilatore non si ottimizzi) e aggiungi questo progetto come dipendenza del tuo progetto web. In questo modo se il progetto di tipo non riesce quindi progetto web compilazione fallisce così

+0

Grazie, ha senso - come suggerisce Rafa forse un'idea migliore è semplicemente non usare web.config per risolvere il problema e guardare altre soluzioni come CIO. –

2

due punti:

Firsly, come fa il progetto compilato anche se i riferimenti sono mancanti? Ciò implica che non ne hai davvero bisogno! Come puoi avere un riferimento fortemente tipizzato a qualcosa che non ti serve? Stai chiedendo di essere avvisato quando ti sei perso un riferimento non necessario?

In secondo luogo,

io non sono ancora chiare su esattamente che cosa si vuole fare, ma penso che ciò che si vuole può essere raggiunto con la creazione di una fase di pre-build. Potrebbe essere necessario scrivere un piccolo programma di console C# per eseguire l'elaborazione e il controllo del file web.config.

È simile al modo in cui Visual Studio genera una classe per rappresentare le risorse o le proprietà se le si aggiunge utilizzando gli strumenti. Ad esempio, se vai a Progetto -> Proprietà, scheda Risorse, quindi crea una risorsa, scoprirai che Visual Studio sputerà un Resources.Designer.File cs con una classe in quanto è possibile quindi fare riferimento al vostro codice come

Properties.Resources.MyTestResource 

È interessante notare che, all'interno del codice generato è questo commento

/// <summary> 
/// A strongly-typed resource class, for looking up localized strings, etc. 
/// </summary> 
// This class was auto-generated by the StronglyTypedResourceBuilder 
// class via a tool like ResGen or Visual Studio. 
// To add or remove a member, edit your .ResX file then rerun ResGen 
// with the /str option, or rebuild your VS project. 

Sembra che si potrebbe essere in grado di fare qualcosa di simile nel tuo progetto, magari aggiungendo un passo pre-build che genera la classe per te?

classe Lo StronglyTypedResourceBuilder ha una pagina di riferimento qui:

http://msdn.microsoft.com/en-us/library/system.resources.tools.stronglytypedresourcebuilder.aspx

Sembra ragionevolmente facile da usare. Questo potrebbe non essere applicabile nel tuo scenario, però, lo sto solo usando come esempio. Sembra più che tu voglia generare un tipo di proxy o qualcosa del genere ...

1

Ti consiglierei come alternativa all'utilizzo di un qualche tipo di sistema IoC. Microsoft offre già Unity Framework, funzionerà meglio di questa soluzione che stai provando. Anche Ninject è abbastanza buono.

http://www.ninject.org/

+0

Penso che potrebbe essere l'idea migliore, suppongo che se non è possibile ottenere errori di compilazione nel web.config per i tipi mancanti, una soluzione diversa avrebbe senso. –

0

In base a quello che ha detto Philip Daniels, potrebbe essere necessario un post-generazione passo.

Lascia che il progetto venga compilato in modo che possa collocare tutte le DLL di riferimento nella sua cartella di output e quindi avere uno strumento (probabilmente personalizzato scritto o forse se c'è qualcosa su Github o Codeplex) scansionare il file .config e vedere se il il tipo specificato può essere trovato nella cartella di output.

Se non può essere trovato, lo strumento restituisce un codice di ritorno diverso da zero per indicare il processo di compilazione (assicurati che si agganci al processo di compilazione, dovresti lasciare che l'evento di costruzione di ms-project catturare manualmente quel codice di errore, penso) che non è riuscito con un messaggio di errore appropriato.

0

Fai un passo MSBuild da entrambe la creazione di un new Task implementation, o utilizzando il Inline Task, che analizza i nomi di classe dal tuo web.config e tenta di caricare utilizzando Assembly.Load. Se il caricamento fallisce, genererà un'eccezione che fallirà la tua build.

0

Puoi provare a scrivere un Test unitario che utilizzerà questa configurazione e integrerà il test come parte della compilazione? Ciò fornirà l'indicatore corretto che alcuni test hanno esito negativo anche in un sistema di compilazione automatizzato e ti aiutano a cogliere il problema.

Oppure puoi provare a mettere la configurazione di whizBangs in un file di configurazione separato e menzionare la fonte in web.config. Quando questo file di configurazione separato viene salvato, è possibile richiamare un customtool (funzionalità per lo strumento personalizzato già disponibile in VS) che genererà automaticamente un file cs che costituisce la rappresentazione di classe del file di configurazione. Questo file cs può essere archiviato con i commenti appropriati generati dallo strumento personalizzato che ne indica lo scopo. Ogni volta che uno sviluppatore cambia questo file e lo salva, entrambi i file config e cs verranno controllati e modificati.

Problemi correlati