A DotNet Raider

My adventures in the .NET world!
posts - 33, comments - 12, trackbacks - 0

My Links

News

Martino Bordin

Crea il tuo badge View Martino Bordin's profile on LinkedIn XBOX 360 AVATAR - BORD1986
Locations of visitors to this page

Archives

Post Categories

Arch

BlogRoll

Codeplex

Google code

MSDN

Sites

mercoledì 17 aprile 2013

Visualizzare il Viewmodel di KnockoutJS

Ultimamente mi sto dilettando su un progetto che utilizza ASP.NET MVC in accoppiata con KnockoutJs.

Si tratta di un'applicazione Single-Page che, tramite AJAX, va a costruire dinamicamente il ViewModel Knockout e che quindi, a seconda della navigazione compiuta dall'utente tramite richieste multiple e asincrone, può diventare "grande" a piacere e difficilmente debuggabile.

Mi è quindi tornato utile questo snippet, che permette di visualizzare lo stato attuale del ViewModel, mostrando tutte le proprietà presenti e i relativi valori, in formato json: 

 

<div style="border: 2px dashed red">

   <h1>KnockoutJS ViewModel Viewer:</h1>

<div data-bind="text: ko.toJSON($root)"></div>

</div>

Questo un esempio di quanto verrà stampato a video:

 

posted @ mercoledì 17 aprile 2013 10.20 | Feedback (0) | Filed Under [ ASP.NET JQuery & JScript ]

martedì 6 novembre 2012

Code Coverage e Test Settings

Il code coverage è un'indice importante per avere un'idea della percentuale di codice coperto da unit-test.

Se utilizzate il framework di unit-test Microsoft (MSTest), Visual Studio è in grado di calcolare tale indice automaticamente (maggiori dettagli qui).

Tempo fa avevo instrumentato questo tool su un mio progetto ed oggi, dopo aver fatto refactoring ed aggiunto alcune funzionalità, volevo visualizzare i dati di code coverage.

Lanciando il tool, ottenevo tuttavia questo messaggio:

"Cannot find any coverage data (.coverage or .coveragexml) files. Check test run details for possible errors."

Dopo un pò di verifiche ho scoperto l'inghippo: per qualche motivo il file di impostazioni dei test corrente era "Trace and Test Impact" e non "Local".

posted @ martedì 6 novembre 2012 16.55 | Feedback (0) | Filed Under [ VISUAL STUDIO ]

giovedì 23 agosto 2012

Manipolazione di file zip con il framework 4.5

Dalla versione 4.5 del .NET framework è finalmente supportata out-of-the-box la manipolazione di file zip senza l'utilizzo di librerie di terze parti.

Sono ora disponibili infatti 2 assembly System.IO.Compression e System.IO.Compression.FileSystem che permettono, ad esempio, di enumerare i file presenti in uno zip, estrarli, creare nuovi file zip, etc.

Ad esempio, ecco come si ottiene l'elenco dei file contenuti in uno zip:

  const string zipFilePath = @"C:\temp\files.zip";

    using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open)){
    using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Read)) {

        foreach (var zipArchiveEntry in archive.Entries) {
            Console.WriteLine("File name: {0}", zipArchiveEntry.FullName);}
    }}

E come si estraggono in una directory:

const string zipFilePath = @"C:\temp\files.zip";
    const string dirToExtract = @"C:\temp\";

    using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open)) {
    using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Update))
        archive.ExtractToDirectory(dirToExtract);}}

Vi lascio quindi i riferimenti di MSDN:

ZipArchive Class

System.IO.Compression

 

 

posted @ giovedì 23 agosto 2012 10.38 | Feedback (0) | Filed Under [ VISUAL STUDIO MISC ]

mercoledì 22 agosto 2012

(Dis)Attivare elementi con JQuery

Una delle cose che più mi piacciono di JQuery è la facilità con la quale è possibile estendere le sue funzionalità.

Ecco infatti come è possibile implementare le funzioni per attivare e disattivare gli elementi del DOM:

// Set an element as enabled, if supported
$.fn.enable= function () {
    return this.each(function () {
        if (typeof this.disabled != "undefined") {
            this.disabled = false;
        }
    });
};

// Set an element as disabled, if supported
$.fn.disable = function () {
    return this.each(function () {
        if (typeof this.disabled != "undefined") {
            this.disabled = true;
        }
    });
};

In questo modo è possibile (dis)abilitare qualsiasi elemento con i soliti selettori JQuery:

$("*").enable();

$(".editor").disable();

posted @ mercoledì 22 agosto 2012 11.08 | Feedback (0) | Filed Under [ JQuery & JScript ]

lunedì 11 giugno 2012

Utilizzare l’interfaccia Metro su un’applicazione WPF

Se negli ultimi anni non avete vissuto su Marte, avrete sicuramente sentito parlare dell’interfaccia Metro (per i marziani, ecco un link che vi spiega velocemente cos’è  ).

Nel caso stiate sviluppando applicazioni per Windows Phone o Windows 8 (le famose Metro App), avrete già tutti i controlli disponibili che seguono questo stile, senza dover adottare alcun accorgimento particolare..

E nel caso di applicazioni WPF?

Bhè, esiste il toolkit di Mahapps, che ci omaggia di una serie di controlli, stili, behaviors e attached properties che fanno proprio al caso nostro!

Come potete vedere il risultato è notevole, e senza particolari stravolgimenti del nostro Xaml:

Metro is everywhere! Sorriso

P.S: Anche per il web sono disponibile progetti interessanti (es link1 , link2)

posted @ lunedì 11 giugno 2012 16.00 | Feedback (0) | Filed Under [ WPF ]

giovedì 5 aprile 2012

Merge di DLL in un’applicazione WPF

Recentemente ho dovuto creare un’applicazione WPF che fosse facilmente distribuibile (leggi: distribuire solo l’exe).

Purtroppo il tool ILMerge non funziona per applicazioni WPF, a causa di problemi con le risorse contenute in esse (esistono comunque tool funzionanti di terze parti, a pagamento).

Seguendo questo post, ho creato un esempio che qui illustro e che potete scaricare qui.

L’applicazione visualizza semplicemente il fullname di due classi presenti in 2 assembly referenziati:

image

 

Per prima cosa è necessario modificare il file di progetto dell’applicazione WPF aggiungendo, dopo “Microsoft.CSharp.targets” , il seguente snippet:

  1. <Target Name="AfterResolveReferences">
  2.     <ItemGroup>
  3.       <EmbeddedResource Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.Extension)' == '.dll'">
  4.         <LogicalName>%(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)</LogicalName>
  5.       </EmbeddedResource>
  6.     </ItemGroup>
  7.   </Target>

Semplicemente, andiamo ad indicare di inserire tutti i file referenziati con estensione “.dll” come “emdedded resource” nell’exe principale. In questo modo eviteremo di eseguire a mano l’inclusione dell’ultima versione delle librerie compilate.

Nelle proprietà del progetto, impostiamo il seguente comando da eseguire durante la fase di post-build: “del $(TargetDir)*.dll” per cancellare tutte le librerie presenti nella “bin”, che non ci serviranno più...

image

 

Impostiamo quindi come oggetto di avvio la classe Bootstrapper (potete ovviamente cambiare il nome):

image

 

Questa, infine, è come definita la classe BootStrapper:

  1. public class BootStrapper
  2. {
  3.     [STAThread]
  4.     public static void Main(string[] args)
  5.     {
  6.         AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
  7.         App.Main();
  8.     }
  9.  
  10.     private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args)
  11.     {
  12.         var executingAssembly = Assembly.GetExecutingAssembly();
  13.         var assemblyName = new AssemblyName(args.Name);
  14.  
  15.         string path = string.Format("{0}.dll", assemblyName.Name);
  16.         if (assemblyName.CultureInfo.Equals(CultureInfo.InvariantCulture) == false)
  17.         {
  18.             path = string.Format(@"{0}\\cf4 {1}", assemblyName.CultureInfo, path);
  19.         }
  20.  
  21.         using (var stream = executingAssembly.GetManifestResourceStream(path))
  22.         {
  23.             if (stream == null)
  24.             {
  25.                 return null;
  26.             }
  27.  
  28.             var assemblyRawBytes = new byte[stream.Length];
  29.             stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length);
  30.             return Assembly.Load(assemblyRawBytes);
  31.         }
  32.     }
  33. }

 

Sostanzialmente ci agganciamo all’evento AssemblyResolve dell’AppDomain corrente, che viene sollevato ogni volta che la risoluzione di un’assembly fallisce, e ritorniamo l’assembly che abbia in canna nelle embedded resources.

Ecco infatti come si presenta il nostro exe “aprendolo” con ILSpy:

image

E’ anche più semplice di usare la riga di comando di ILMerge ! A bocca aperta

posted @ giovedì 5 aprile 2012 14.07 | Feedback (0) | Filed Under [ WPF VISUAL STUDIO ]

martedì 3 aprile 2012

Listbox WPF: disabilitata ma non troppo!

Recentemente ho dovuto realizzare una sorta di wizard in WPF, ovvero una classica window con un’intestazione, una listbox a sinistra che visualizza gli step (evidenziando lo step corrente) e un contentpresenter in cui verrà caricato il contenuto dinamicamente. Niente di complicato.

La cosa “particolare” è il fatto che la listbox con l’elenco degli step è read-only, ovvero  deve solo presentare i dati e l’utente  non deve poter selezionare qual’è lo step corrente..altrimenti che procedura guidata è? .

Ovviamente è possibile disabilitare la listbox , ma in questo  modo lo stile applicato rende il tutto poco usabile e gradevole (un grigio che mina la leggibilità del controllo )..e di certo non mi andava di rifare il template del controllo per questa sciocchezza.

Ho risolto semplicemente creando uno style per l’ItemContainer e impostando a false la proprietà Focusable:

  1. <ListBox.ItemContainerStyle>
  2.                 <Style TargetType="{x:Type ListBoxItem}">
  3.                     <Setter Property="Focusable" Value="False"/>
  4.                     <Style.Triggers>
  5.                         <Trigger Property="IsSelected" Value="True">
  6.                             <Setter Property="FontWeight" Value="Bold" />
  7.                         </Trigger>
  8.                     </Style.Triggers>
  9.                 </Style>
  10.             </ListBox.ItemContainerStyle>

 

Thanks WPF!

posted @ martedì 3 aprile 2012 13.55 | Feedback (0) | Filed Under [ WPF Blend ]

martedì 10 gennaio 2012

Automapper : creare Dto da proxy Nhibernate

automapperSe utilizzate AutoMapper per creare Dto da oggetti letti con Nhibernate e lazy-loading attivo, è possibile che otteniate un’eccezione di tipo ObjectDisposedException, in quanto Automapper accede a proprietà “Lazy”, ma la sessione è già stata chiusa e distrutta.

Per risolverlo, basta implementare un Custom Resolver, che tornerà null qualora il tipo della proprietà che sto provando a mappare sia un proxy non inizializzato.

Ecco quindi il codice:

  1. public class NhProxyResolver : ValueResolver<object, object>
  2. {
  3.     protected override object ResolveCore(object source)
  4.     {
  5.         return NHibernateUtil.IsInitialized(source) ? source : null;
  6.     }
  7. }

 

ed un esempio della configurazione di AutoMapper:

  1. Mapper.CreateMap<User, UserDto>()
  2.     .ForMember(x => x.Orders, opt => opt.ResolveUsing<NhProxyResolver>().FromMember(z => z.Orders));

posted @ mercoledì 29 febbraio 2012 0.00 | Feedback (0) | Filed Under [ WPF SILVERLIGHT O/RM ]

martedì 28 febbraio 2012

Transazioni attive su SQL Server

Recentemente  mi è tornato utile avere l’elenco delle transazioni attive con il relativo statemente T-SQL.

Ecco la query che ho utilizzato:

SELECT s_tst.[session_id],
   s_es.[login_name] AS [Login Name],
   DB_NAME (s_tdt.database_id) AS [Database],
   s_tdt.[database_transaction_begin_time] AS [Begin Time],
   s_tdt.[database_transaction_log_record_count] AS [Log Records],
   s_tdt.[database_transaction_log_bytes_used] AS [Log Bytes],
   s_tdt.[database_transaction_log_bytes_reserved] AS [Log Rsvd],
   s_est.[text] AS [Last T-SQL Text],
   s_eqp.[query_plan] AS [Last Plan]
FROM sys.dm_tran_database_transactions s_tdt
   JOIN sys.dm_tran_session_transactions s_tst
      ON s_tst.[transaction_id] = s_tdt.[transaction_id]
   JOIN sys.[dm_exec_sessions] s_es
      ON s_es.[session_id] = s_tst.[session_id]
   JOIN sys.dm_exec_connections s_ec
      ON s_ec.[session_id] = s_tst.[session_id]
   LEFT OUTER JOIN sys.dm_exec_requests s_er
      ON s_er.[session_id] = s_tst.[session_id]
   CROSS APPLY sys.dm_exec_sql_text (s_ec.[most_recent_sql_handle]) AS s_est
   OUTER APPLY sys.dm_exec_query_plan (s_er.[plan_handle]) AS s_eqp
ORDER BY [Begin Time] ASC;

Utile nel caso di transazioni bloccate\bloccanti!

posted @ martedì 28 febbraio 2012 12.48 | Feedback (0) | Filed Under [ SQL Server ]

martedì 20 dicembre 2011

Gestione di namespace e cartelle in Visual Studio

Come tutti sapete all’interno di Visual Studio (pannello “Solution Explorer”) è possibile creare cartelle in cui andremo inserire le nostre classi.

Per impostazione predefinita, la struttura di queste cartelle andrà a definire quello che viene chiamato Fully qualified name (FQN), ovvero il nome che identifica in modo univoco la nostra classe: Namespace.NomeClasse.

Pertanto, se la nostra solution è organizzata in questo modo

image

il FQN di customer sarà Sample.Domain.Customer.

Mano a mano che il progetto cresce potremmo trovarci in situazioni in cui la cartelle contengono raggruppamenti logici di file che tuttavia non vogliamo entrino in gioco nella costruzione del FQN.

Per esempio, se nella cartella Domain creiamo una sottocartella Customer

image

Resharper ci segnala che il namespace della classe non è coerente  con la posizione del file:

image

Per risolvere il “problema” (ovviamente il progetto compila lo stesso, ma è una segnalazione utile per mantenere lo standard qualitativo del codice) basta impostare a False la voce “Namespace Provider” tra le proprietà della cartella.

image

posted @ martedì 20 dicembre 2011 12.34 | Feedback (0) | Filed Under [ VISUAL STUDIO ]

Powered by: