Per la realizzazione di un progetto ho incluso come embedded resources diversi file (report, immagini, xml, etc...) in modo da semplificare il deploy. Per lasciare comunque la possibilità di customizzare l'installazione ho creato questa classe helper che permette di fare il dump della risorsa embedded su file system. Il codice che accede alla risorsa chiama sempre la EnsureFileSystemCopy poi accede tramite file system. In questo modo chi installa / assiste ha libertà di azione.
In caso di "disastro" basta svuotare la cartella di dump delle risorse per tornare alla situazione originale.
| 1. | using System; |
| 2. | using System.IO; |
| 3. | using System.Reflection; |
| 4. | |
| 5. | namespace Prxm.Pass.Framework.Helpers |
| 6. | { |
| 7. | public static class EmbeddedResourcesHelper |
| 8. | { |
| 9. | public static void EnsureFileSystemCopy(Assembly assembly, string resourceName, string filename) |
| 10. | { |
| 11. | if (File.Exists(filename)) |
| 12. | return; |
| 13. | |
| 14. | string folder = Path.GetDirectoryName(filename); |
| 15. | if (!Directory.Exists(folder)) |
| 16. | Directory.CreateDirectory(folder); |
| 17. | |
| 18. | using (var stream = assembly.GetManifestResourceStream(resourceName)) |
| 19. | { |
| 20. | if (null == stream) |
| 21. | throw new Exception(string.Format("Cannot find resource {0} in assembly {1}", resourceName, |
| 22. | assembly.FullName)); |
| 23. | |
| 24. | using (var reader = new BinaryReader(stream)) |
| 25. | { |
| 26. | using (var writer = new BinaryWriter(File.Create(filename))) |
| 27. | { |
| 28. | byte[] buffer; |
| 29. | while((buffer = reader.ReadBytes(1024)).Length > 0) |
| 30. | writer.Write(buffer); |
| 31. | |
| 32. | writer.Flush(); |
| 33. | } |
| 34. | } |
| 35. | } |
| 36. | } |
| 37. | } |
| 38. | } |
| 39. | |
Ho installato l'ottimo plugin per Resharper per abilitare l'analisi di codice sui file di mapping. Il progetto compila bene ma l'analizzatore di codice del plugin segnala che Guid (chiave della mia entity) non è di tipo 'T'.
La mia entity implementa IEntity<T> ed eredita l'id da una EntityBase<T> creata con T => Guid
Grazie al fatto che sono disponibili i sorgenti scarico dal repository e compilo. Avvio il debug il plugin (con stupore noto che lanciare un secondo vs in debug è più veloce che lanciare un altro vs da shell) e trovo la riga incriminata. R# segnala che il mio field _id su cui è mappata la chiave della mia entity è di tipo T piuttosto che risolvere il tipo in Guid. Visto che il resto dell'analisi di codice funziona bene non so se il problema è nel plugin o in R#. Per ora l'ho segnalato qui http://code.google.com/p/nhplugin/issues/detail?id=19.
Per bypassare in attesa di una risposta ho "tapullato" modificando in modo brutale il file \Analysis\MappingFile\MappingFileAnalysisElementProcessor.cs alla riga 446 aggiungendo nel controllo del tipo lo skip di T -> fieldType.GetCLRName().CompareTo("T") != 0
Ancora una volta non posso far altro che apprezzare il "sorgente aperto".