<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>IDisposable Thoughts</title>
	
	<link>http://www.cprieto.com</link>
	<description>Honey... where is my coding t-shirt?</description>
	<lastBuildDate>Mon, 02 Aug 2010 20:14:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/IdisposableThoughts" /><feedburner:info uri="idisposablethoughts" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Writing a Windsor Service Locator adapter for ASP.NET MVC3 Preview 1</title>
		<link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/yNjhA2uNcbI/</link>
		<comments>http://www.cprieto.com/index.php/2010/07/30/windsor-service-locator-for-asp-net-mvc3-preview-1/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 22:50:22 +0000</pubDate>
		<dc:creator>cristian</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[ioc]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[windsor]]></category>

		<guid isPermaLink="false">http://www.cprieto.com/index.php/2010/07/30/windsor-service-locator-for-asp-net-mvc3-preview-1/</guid>
		<description><![CDATA[A few days ago Scott Guthrie announced the ASP.NET MVC 3 Preview 1 availability. The team did such a great job adding Dependency Injection to the whole framework using a slightly modified Service Locator, in that way you may plug your favorite DI container. As you may imagine, there is no DI container shipped with [...]]]></description>
			<content:encoded><![CDATA[<p>A few days ago <a href="http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx">Scott Guthrie announced the ASP.NET MVC 3 Preview 1 availability</a>. The team did such a great job adding Dependency Injection to the whole framework using a slightly modified <a href="http://commonservicelocator.codeplex.com/">Service Locator</a>, in that way you may plug your favorite DI container. As you may imagine, there is no DI container shipped with this first preview, so you need to roll your own. <a href="http://bradwilson.typepad.com/blog/">Brad Wilson</a> did such a terrific job writing a <a href="http://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.html">post series about DI using MVC 3 Preview 1</a> and create a <a href="http://unity.codeplex.com/">Unity Container</a> Service Locator adapter, I really recommend you read his blog post series before continue with this post <img src='http://www.cprieto.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>I prefer <a href="http://castleproject.org/container/index.html">Castle Windsor Container</a>, so using his blog posts as a blueprint, I write a simple Service Locator adapter for Castle Windsor. </p>
<p>Let’s tart with the Controller Factory:</p>
<pre class="brush: csharp;">using System.Web.Mvc;
using System.Web.Routing;
using Castle.MicroKernel;

namespace Castle.Windsor.Mvc {
    public class WindsorControllerFactory : IControllerFactory {
        private readonly IControllerFactory _defaultFactory;
        private readonly IWindsorContainer _container;

        public WindsorControllerFactory(IWindsorContainer container) : this(container, new DefaultControllerFactory()) {
            _container = container;
        }

        public WindsorControllerFactory(IWindsorContainer container, IControllerFactory defaultFactory) {
            _container = container;
            _defaultFactory = defaultFactory;
        }

        public IController CreateController(RequestContext requestContext, string controllerName) {
            try {
                return _container.Resolve&lt;IController&gt;(controllerName.ToLowerInvariant());
            } catch (ComponentNotFoundException) {
                return _defaultFactory.CreateController(requestContext, controllerName);
            }
        }

        public void ReleaseController(IController controller) {
            _container.Release(controller);
        }
    }
}</pre>
<p>Pretty straighforward, now, it’s time for the Castle Windsor adapter for <strong>MvcServiceLocator</strong>, it is almost a wrap over Windsor methods:</p>
<pre class="brush: csharp;">using System;
using System.Linq;
using System.Collections.Generic;
using System.Web.Mvc;

namespace Castle.Windsor.Mvc {
    public class WindsorMvcServiceLocator : IMvcServiceLocator {
        private readonly IWindsorContainer _container;

        public WindsorMvcServiceLocator(IWindsorContainer container) {
            _container = container;
        }

        public object GetService(Type serviceType) {
            return _container.Resolve(serviceType);
        }

        public IEnumerable&lt;TService&gt; GetAllInstances&lt;TService&gt;() {
            return _container.ResolveAll&lt;TService&gt;();
        }

        public IEnumerable&lt;object&gt; GetAllInstances(Type serviceType) {
            return _container.ResolveAll(serviceType).Cast&lt;object&gt;();
        }

        public TService GetInstance&lt;TService&gt;() {
            return _container.Resolve&lt;TService&gt;();
        }

        public TService GetInstance&lt;TService&gt;(string key) {
            return _container.Resolve&lt;TService&gt;(key);
        }

        public object GetInstance(Type serviceType) {
            return GetService(serviceType);
        }

        public object GetInstance(Type serviceType, string key) {
            return _container.Resolve(key, serviceType);
        }

        public void Release(object instance) {
            _container.Release(instance);
        }
    }
}</pre>
<p>To allow inject filters you need to provide a <strong>IFilterProvider</strong> implementation, I did it using Brad’s post about DI on <em>Action Filters</em>:</p>
<pre class="brush: csharp;">using System.Web.Mvc;

namespace Castle.Windsor.Mvc {
    public class WindsorFilterAttributeFilterProvider : FilterAttributeFilterProvider {
        private readonly IWindsorContainer _container;

        public WindsorFilterAttributeFilterProvider(IWindsorContainer container) {
            _container = container;
        }

        protected override System.Collections.Generic.IEnumerable&lt;FilterAttribute&gt; GetControllerAttributes(
            ControllerContext controllerContext, ActionDescriptor actionDescriptor) {
            var attributes = base.GetControllerAttributes(controllerContext, actionDescriptor);
            foreach (var attribute in attributes) {
                _container.BuildUp(attribute.GetType(), attribute);
            }

            return attributes;
        }

        protected override System.Collections.Generic.IEnumerable&lt;FilterAttribute&gt; GetActionAttributes(
            ControllerContext controllerContext, ActionDescriptor actionDescriptor) {
            var attributes = base.GetActionAttributes(controllerContext, actionDescriptor);
            foreach (var attribute in attributes) {
                _container.BuildUp(attribute.GetType(), attribute);
            }

            return attributes;
        }
    }
}</pre>
<p>That last part was a little different than others mainly because we cannot use <strong>constructor injection</strong> in Attributes, so an easy way is just to create a simple method extension to extend Windsor and inject the properties in an already created instance:</p>
<pre class="brush: csharp;">

using System;
using System.Linq;

namespace Castle.Windsor.Mvc {
    public static class WindsorExt {
        public static void BuildUp(this IWindsorContainer container, Type type, object instance) {
            var properties = type.GetProperties().Where(p =&gt; p.CanWrite &amp;&amp; p.PropertyType.IsPublic);
            foreach (var propertyInfo in properties) {
                if (container.Kernel.HasComponent(propertyInfo.PropertyType)) {
                    propertyInfo.SetValue(instance, container.Resolve(propertyInfo.PropertyType), null);
                }
            }
        }
    }
}

</pre>
<p>Simple&#8230; you can grab the sourcecode from my bitbucket repository <a href="http://bitbucket.org/cprieto/castle-windsor-mvc">http://bitbucket.org/cprieto/castle-windsor-mvc</a></p>
<p><strong>NOTE:</strong> before anybody else start screaming about using Service Locator: I <strong>don’t</strong> like at all the use of Service Locator, and I think it must be considered <em>the atomic bomb</em> in component injection (it’s even considered an <strong><a href="http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx">antipattern as Mark Seeman describes</a></strong>). I’m writing this articule to sample how to to plug your own DI framework inside ASP.NET MVC 3 Preview 1… at least we have <em>now</em> a native way to do it.</p>
<img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/yNjhA2uNcbI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cprieto.com/index.php/2010/07/30/windsor-service-locator-for-asp-net-mvc3-preview-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.cprieto.com/index.php/2010/07/30/windsor-service-locator-for-asp-net-mvc3-preview-1/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=windsor-service-locator-for-asp-net-mvc3-preview-1</feedburner:origLink></item>
		<item>
		<title>VAN ASP.NET MVC3 y Razor en Alt.Net Hispano</title>
		<link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/6QHaPVXD924/</link>
		<comments>http://www.cprieto.com/index.php/2010/07/30/van-asp-net-mvc3-y-razor-en-alt-net-hispano/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 20:15:41 +0000</pubDate>
		<dc:creator>cristian</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[alt.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[presentación]]></category>
		<category><![CDATA[van]]></category>
		<category><![CDATA[web dev]]></category>
		<category><![CDATA[windsor]]></category>

		<guid isPermaLink="false">http://www.cprieto.com/index.php/2010/07/30/van-asp-net-mvc3-y-razor-en-alt-net-hispano/</guid>
		<description><![CDATA[Hoy tube el placer de compartir con mis camaradas “alt.netters” de Alt.Net Hispano en la VAN titulada “Webmatrix, Razor, MVC3 y otras hierbas”. Interesante la discusión y comentarios post VAN. Pronto publicaran los videos de la VAN para verlos offline, mientras tanto los dejo con las diapositivas Webmatrix, razor, mvc3 y otras hierbas View more [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy tube el placer de compartir con mis camaradas “alt.netters” de Alt.Net Hispano en la VAN titulada “Webmatrix, Razor, MVC3 y otras hierbas”. Interesante la discusión y comentarios post VAN. Pronto publicaran los videos de la VAN para verlos offline, mientras tanto los dejo con las diapositivas <img src='http://www.cprieto.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div style="width: 425px" id="__ss_4874761"><strong style="margin: 12px 0px 4px; display: block"><a title="Webmatrix, razor, mvc3 y otras hierbas" href="http://www.slideshare.net/kementeus/webmatrix-razor-mvc3-y-otras-hierbas">Webmatrix, razor, mvc3 y otras hierbas</a></strong><object id="__sse4874761" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=webmatrixrazormvc3yotrashierbas-100730150726-phpapp01&amp;stripped_title=webmatrix-razor-mvc3-y-otras-hierbas" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed name="__sse4874761" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=webmatrixrazormvc3yotrashierbas-100730150726-phpapp01&amp;stripped_title=webmatrix-razor-mvc3-y-otras-hierbas" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/kementeus">kementeus</a>.</div>
</p></div>
<p><strong>NOTA:</strong> El código de mi ejemplo de Windsor Service Locator para MVC 3 pueden encontrarlo en mi cuenta de <a href="http://bitbucket.org">Bitbucket</a> <a href="http://bitbucket.org/cprieto/castle-windsor-mvc">http://bitbucket.org/cprieto/castle-windsor-mvc</a></p>
<img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/6QHaPVXD924" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cprieto.com/index.php/2010/07/30/van-asp-net-mvc3-y-razor-en-alt-net-hispano/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.cprieto.com/index.php/2010/07/30/van-asp-net-mvc3-y-razor-en-alt-net-hispano/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=van-asp-net-mvc3-y-razor-en-alt-net-hispano</feedburner:origLink></item>
		<item>
		<title>PHP y Microsoft como plataforma</title>
		<link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/MYbk6C7qhrU/</link>
		<comments>http://www.cprieto.com/index.php/2010/07/11/php-y-microsoft-como-plataforma/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 22:49:19 +0000</pubDate>
		<dc:creator>cristian</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[web dev]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.cprieto.com/index.php/2010/07/11/php-y-microsoft-como-plataforma/</guid>
		<description><![CDATA[Hace unas semanas fui invitado por parte de Microsoft a conversar un poco en el DrupalCamp 2010 que se realizó en Guatemala, quizás muchos no lo saben pero en “una vida pasada” fui developer en PHP por mucho tiempo (ufff… tiempos aquellos). Bien, fue interesante regresar a hablar sobre el soporte en que ahora ha [...]]]></description>
			<content:encoded><![CDATA[<p>Hace unas semanas fui invitado por parte de Microsoft a conversar un poco en el DrupalCamp 2010 que se realizó en Guatemala, quizás muchos no lo saben pero en “una vida pasada” fui developer en PHP por mucho tiempo (ufff… tiempos aquellos). Bien, fue interesante regresar a hablar sobre el soporte en que ahora ha trabajado Microsoft en su “stack” junto con PHP, transformando a Microsoft Windows no solamente en una excelente plataforma de desarrollo para PHP, sino también en una fuerte plataforma de ejecución.</p>
<p>Como lo había prometido (pero un poco tarde esta vez) los dejo con las diapositivas de la charla, quizás algún otro día conversamos un poco más sobre PHP (si me diera tiempo claro).</p>
<div style="width: 425px" id="__ss_4727487"><strong style="margin: 12px 0px 4px; display: block"><a title="Windows + php = great drupal" href="http://www.slideshare.net/kementeus/windows-php-great-drupal">Windows + php = great drupal</a></strong><object id="__sse4727487" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=windowsphpgreatdrupal-100710165859-phpapp02&amp;stripped_title=windows-php-great-drupal" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed name="__sse4727487" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=windowsphpgreatdrupal-100710165859-phpapp02&amp;stripped_title=windows-php-great-drupal" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/kementeus">kementeus</a>.</div>
</p></div>
<img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/MYbk6C7qhrU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cprieto.com/index.php/2010/07/11/php-y-microsoft-como-plataforma/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.cprieto.com/index.php/2010/07/11/php-y-microsoft-como-plataforma/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=php-y-microsoft-como-plataforma</feedburner:origLink></item>
		<item>
		<title>Contribuyendo al proyecto Vale, ¿por dónde comienzo?</title>
		<link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/6ok-Pmqsl60/</link>
		<comments>http://www.cprieto.com/index.php/2010/07/11/contribuyendo-al-proyecto-vale-por-donde-comienzo/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 22:22:46 +0000</pubDate>
		<dc:creator>cristian</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[alt.net]]></category>
		<category><![CDATA[comunidad]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://www.cprieto.com/index.php/2010/07/11/contribuyendo-al-proyecto-vale-por-dnde-comienzo/</guid>
		<description><![CDATA[Como muchos recordaran, por iniciativa de los líderes de Alt.Net hispano se comenzó un proyecto desde cero, el proyecto Vale, una plataforma de validación que muestra y pretende enseñar la mística de como contribuir a proyectos OSS y usar Test Driven Development como herramienta de diseño y uso. Algo que suele preguntarme la gente es [...]]]></description>
			<content:encoded><![CDATA[<p>Como muchos recordaran, por iniciativa de los líderes de <a href="http://www.altnethispano.org">Alt.Net hispano</a> se comenzó un proyecto desde cero, el <a href="http://vale.codeplex.com">proyecto Vale</a>, una plataforma de validación que muestra y pretende enseñar la mística de como contribuir a proyectos OSS y usar <a href="http://en.wikipedia.org/wiki/Test_driven_development">Test Driven Development</a> como herramienta de diseño y uso. Algo que suele preguntarme la gente es “quiero contribuir y aprender pero… ¿y por dónde comienzo?&quot; bien, a manera de ejemplo decidí crear un pequeño screencast sobre como contribuir con una feature nueva al proyecto, desde su concepción hasta enviar nuestros cambios al repositorio. Es mi primer “screencast”, así que con gusto escucho sugerencias <img src='http://www.cprieto.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p> <object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13238282&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=13238282&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object>
<p><a href="http://vimeo.com/13238282">Contribuyendo al proyecto Vale</a> from <a href="http://vimeo.com/user3305164">Cristian Prieto</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/6ok-Pmqsl60" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cprieto.com/index.php/2010/07/11/contribuyendo-al-proyecto-vale-por-donde-comienzo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.cprieto.com/index.php/2010/07/11/contribuyendo-al-proyecto-vale-por-donde-comienzo/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=contribuyendo-al-proyecto-vale-por-donde-comienzo</feedburner:origLink></item>
		<item>
		<title>Lanzamiento de Visual Studio 2010 en la comunidad</title>
		<link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/e9VB5KBWRSo/</link>
		<comments>http://www.cprieto.com/index.php/2010/07/10/lanzamiento-de-visual-studio-2010-en-la-comunidad/#comments</comments>
		<pubDate>Sat, 10 Jul 2010 22:09:58 +0000</pubDate>
		<dc:creator>cristian</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[4.0]]></category>
		<category><![CDATA[comunidad]]></category>
		<category><![CDATA[presentación]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://www.cprieto.com/index.php/2010/07/10/lanzamiento-de-visual-studio-2010-en-la-comunidad/</guid>
		<description><![CDATA[Hace poco más de una semana se llevó a cabo el lanzamiento comunitario de Visual Studio 2010 en la Ciudad de Guatemala, junto con compañeros como Carlos Lone (Microsoft Client Application Development MVP) y Manolo Herrera (Microsoft Sharepoint MVP) tube el honor de presentar las nuevas características y ventajas de esta nueva versión de ASP.NET [...]]]></description>
			<content:encoded><![CDATA[<p>Hace poco más de una semana se llevó a cabo el lanzamiento comunitario de Visual Studio 2010 en la Ciudad de Guatemala, junto con compañeros como Carlos Lone (Microsoft Client Application Development MVP) y Manolo Herrera (Microsoft Sharepoint MVP) tube el honor de presentar las nuevas características y ventajas de esta nueva versión de ASP.NET 4.0 y Visual Studio 2010.</p>
<p>Como alguno siempre me pide las diapositivas de la presentación, se las dejo para que puedan descargarlas (en Slideshare).</p>
<div style="width: 425px" id="__ss_4727551"><strong style="margin: 12px 0px 4px; display: block"><a title="Visual Studio 2010 Launch - ASP.NET 4.0" href="http://www.slideshare.net/kementeus/visual-studio-2010-launch-aspnet-40">Visual Studio 2010 Launch &#8211; ASP.NET 4.0</a></strong><object id="__sse4727551" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=asp-net4-100710170128-phpapp02&amp;stripped_title=visual-studio-2010-launch-aspnet-40" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed name="__sse4727551" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=asp-net4-100710170128-phpapp02&amp;stripped_title=visual-studio-2010-launch-aspnet-40" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/kementeus">kementeus</a>.</div>
</p></div>
<p>¡Saludos!</p>
<img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/e9VB5KBWRSo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cprieto.com/index.php/2010/07/10/lanzamiento-de-visual-studio-2010-en-la-comunidad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.cprieto.com/index.php/2010/07/10/lanzamiento-de-visual-studio-2010-en-la-comunidad/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=lanzamiento-de-visual-studio-2010-en-la-comunidad</feedburner:origLink></item>
		<item>
		<title>.NET y Configuraciones – Parte 8</title>
		<link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/DvnO__x37oE/</link>
		<comments>http://www.cprieto.com/index.php/2010/07/07/net-y-configuraciones-parte-8/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 20:53:24 +0000</pubDate>
		<dc:creator>cristian</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[web dev]]></category>
		<category><![CDATA[web.config]]></category>

		<guid isPermaLink="false">http://www.cprieto.com/index.php/2010/07/07/net-y-configuraciones-parte-8/</guid>
		<description><![CDATA[La última vez que conversamos acerca de configuraciones sacamos a relucir lo sencillo que es agregar soporte para funciones de validación callback, y antes de eso comentábamos lo sencillo que era agregar soporte para validación de forma declarativa usando los atributos de validación incluídos en la Configuration Framework de la .Net Framework. Hoy seguiremos caminando [...]]]></description>
			<content:encoded><![CDATA[<p>La <a href="http://www.cprieto.com/index.php/2010/07/05/net-y-configuraciones-parte-7/">última vez que conversamos acerca de configuraciones</a> sacamos a relucir lo sencillo que es agregar soporte para funciones de validación callback, y antes de eso comentábamos lo sencillo que era <a href="http://www.cprieto.com/index.php/2010/06/15/net-y-configuraciones-parte-6/">agregar soporte para validación de forma declarativa usando los atributos de validación</a> incluídos en la Configuration Framework de la .Net Framework.</p>
<p>Hoy seguiremos caminando en el soporte de validación customizada de secciones y elementos de validación, pero esta vez creando nuestros propios atributos de validación customizados.</p>
<h3>Atributos de Validación</h3>
<p>Un atributo de validación nos permite validar los elementos o secciones de nuestra configuración de .Net, simplemente tenemos que adornar ese elemento con el atributo en cuestión. La .Net framework nos incluye algunos atributos ya dentro de la caja, pero podemos agregar los nuestros propios de forma sencilla.</p>
<p>Realmente un atributo de validación costa de dos clases: La clase que marca el atributo (un atributo marcador) y la clase que ejecuta la acción de validar (el validador). Como podremos notar en este lado de la framework se utilizan los atributos de una manera muy particular (y que en lo personal me gusta) de mezclar el atributo como marcador pero no como ejecutor.</p>
<p>Usemos un simple ejemplo, imaginemos que necesitamos validar la entrada de correos electrónicos, como todos sabemos, podemos seguir un par de reglas expuestas en una serie de RFC’s acerca de direcciones de email. Bueno, comencemos por la clase que hace realmente la validación, esta debe heredar de la clase <a href="http://msdn.microsoft.com/en-us/library/system.configuration.configurationvalidatorbase.aspx"><code>ConfigurationValidatorBase</code></a> y luego el override de los métodos <a href="http://msdn.microsoft.com/en-us/library/system.configuration.configurationvalidatorbase.canvalidate.aspx"><code>CanValidate</code></a> (que nos dice si podemos o no validar el tipo en cuestión) y <a href="http://msdn.microsoft.com/en-us/library/system.configuration.configurationvalidatorbase.validate.aspx"><code>Validate</code></a> (quien realmente realiza la validación).</p>
<pre class="brush: csharp;wrap-lines: false">using System;
using System.Configuration;
using System.Text.RegularExpressions;

namespace Cprieto.Samples {
    public class EmailValidator : ConfigurationValidatorBase {
        private const string Word = &quot;[^\\x00-\\x1F^\\(^\\)^\\&lt;^\\&gt;^\\@^\\,^\\;^\\:^\\\\^\\\&quot;^\\.^\\[^\\]^\\s]&quot;;
        private const string IpEntry = &quot;\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\]&quot;;
        private static readonly string Domain = string.Format(&quot;({0}+(\\.{0}+)*&quot;, Word);

        private static readonly Regex EmailRegex =
            new Regex(string.Format(&quot;^{0}+(\\.+)*@{1}|{2})$&quot;, Word, Domain, IpEntry), RegexOptions.Compiled);

        public override bool CanValidate(Type type) {
            return type == typeof (string);
        }

        public override void Validate(object value) {
            var item = (string) value;
            if (!string.IsNullOrEmpty(item) &amp;&amp; !EmailRegex.IsMatch(item))
                throw new ArgumentException(&quot;value is not a valid email&quot;);
        }
    }
}</pre>
<p>Bien, ahora simplemente creamos el atributo marcador, este debe heredar de <a href="http://msdn.microsoft.com/en-us/library/system.configuration.configurationvalidatorattribute.aspx"><code>ConfigurationValidatorAttribute</code></a> y la parte importante de este es el override de la propiedad <a href="http://msdn.microsoft.com/en-us/library/system.configuration.configurationvalidatorattribute.validatorinstance.aspx"><code>ValidatorInstance</code></a> que retorna una nueva instancia de nuestra clase validadora.</p>
<pre class="brush: csharp;wrap-lines: false">using System.Configuration;

namespace Cprieto.Samples {
    public class EmailValidatorAttribute : ConfigurationValidatorAttribute {
        public override ConfigurationValidatorBase ValidatorInstance {
            get { return new EmailValidator(); }
        }
    }
}</pre>
<p>Ahora simplemente lo aplicamos a nuestra sección de configuración: </p>
<pre class="brush: csharp;wrap-lines: false">using System.Configuration;

namespace Cprieto.Samples {
    public class SampleConfigurationSection : ConfigurationSection {
        [CallbackValidator(Type = typeof(PortValidator),
            CallbackMethodName = &quot;Validate&quot;)]
        [ConfigurationProperty(&quot;port&quot;, DefaultValue = 80)]
        public int Port {
            get { return (int) this[&quot;port&quot;]; }
        }

        [ConfigurationProperty(&quot;host&quot;, IsRequired = true)]
        public string Host {
            get { return (string) this[&quot;host&quot;]; }
        }

        [EmailValidator]
        [ConfigurationProperty(&quot;email&quot;)]
        public string Email {
            get { return (string) this[&quot;email&quot;]; }
        }
    }
}</pre>
<p>Y claro, nunca cae de más un pequeño archivo de validación que debe marcar como inválido</p>
<pre class="brush: xml;wrap-lines: false">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
&lt;configuration&gt;
  &lt;configSections&gt;
    &lt;section name=&quot;sample&quot;
             type=&quot;Cprieto.Samples.SampleConfigurationSection, Cprieto.Samples.ValidationCallback&quot;/&gt;
  &lt;/configSections&gt;
  &lt;sample port=&quot;80&quot; host=&quot;localhost&quot; email=&quot;invalid@@email&quot; /&gt;
&lt;/configuration&gt;</pre>
<p>Bueno, y ahora me queda pensar que escribo para el siguiente post de la serie <img src='http://www.cprieto.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Hasta la próxima!</p>
<img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/DvnO__x37oE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cprieto.com/index.php/2010/07/07/net-y-configuraciones-parte-8/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.cprieto.com/index.php/2010/07/07/net-y-configuraciones-parte-8/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=net-y-configuraciones-parte-8</feedburner:origLink></item>
		<item>
		<title>Cambiando el usuario de un commit en Mercurial</title>
		<link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/16-BTFWZl60/</link>
		<comments>http://www.cprieto.com/index.php/2010/07/06/cambiando-el-usuario-de-un-commit-en-mercurial/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 01:40:19 +0000</pubDate>
		<dc:creator>cristian</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[dvcs]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://www.cprieto.com/index.php/2010/07/06/cambiando-el-usuario-de-un-commit-en-mercurial/</guid>
		<description><![CDATA[Hoy mi gran amigo José Romaniello (@jfroma) me abarcó con una pregunta acerca de Mercurial un poco curiosa pero bastante bien fundada: Por un error anterior, necesito cambiar el nombre de usuario que aparece registrado en algunos commits de mi repositorio de Mercurial por otro usuario, cómo puedo hacerlo? ¿tengo que reescribir la historia del [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy mi gran amigo José Romaniello (<a href="http://twitter.com/jfroma">@jfroma</a>) me abarcó con una pregunta acerca de Mercurial un poco curiosa pero bastante bien fundada:</p>
<blockquote><p>Por un error anterior, necesito cambiar el nombre de usuario que aparece registrado en algunos commits de mi repositorio de Mercurial por otro usuario, cómo puedo hacerlo? ¿tengo que reescribir la historia del repositorio?</p>
</blockquote>
<p>Digamos que al principio de mis commits utilizaba el nombre de <em>Santa Clos</em> (digamos que así estaba la máquina con que comencé a trabajar el proyecto) y luego decidí cambiar el nombre a mi correcto nombre de <em>Cristian Prieto</em>, bueno, si vemos el log de commits tendremos algo como lo siguiente:</p>
<p><a href="http://www.cprieto.com/wp-content/uploads/2010/07/Powershell20100706_19.20.15.png" rel="lightbox[235]"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Powershell-2010-07-06_19.20.15" border="0" alt="Powershell-2010-07-06_19.20.15" src="http://www.cprieto.com/wp-content/uploads/2010/07/Powershell20100706_19.20.15_thumb.png" width="612" height="485" /></a> </p>
<p>Bueno, si quieren pueden intentar cambiar la historia con <a href="http://mercurial.selenic.com/wiki/MqExtension">Hg mq</a>, pero una manera mucho más sencilla si tienen su historial local es usar a nuestro amigo “Convert”.</p>
<p>Algunos creen que convert (la cual es una extensión de Mercurial incluida en la instalación) simplemente sirve para convertir de un sistema de control de versiones a otro (entiéndase de Subversion a Mercurial, como nos lo muestra nuestro amigo Fabio), la verdad también nos permite convertir de un repositorio de Mercurial a otro, y en el transcurso de la conversión cambiar los valores de cada uno de los commits, entre ellos, el author del commit. En este caso en particular basta con crear un archivo “authors” que contenga la lista de valores de conversión de los autores, es un simple archivo de texto con retorno de carro. En este caso tendremos un archivo con este simple contenido:</p>
<pre class="brush: plain;">Santa Clos &lt;santa@northpole.net&gt;=Cristian Prieto &lt;me@cprieto.com&gt;</pre>
<p>Ahora asegurémonos que tenemos nuestra extensión convert activada, revisen que en su Mercurial.ini tengan la siguiente línea</p>
<pre class="brush: plain;">[extensions]
hgext.convert=</pre>
<p>Y basta solamente convertir nuestros repositorios</p>
<pre class="brush: plain;">hg convert --authors authors.txt orig changed</pre>
<p>Bien, ahora si revisamos el historial nos quedaría bello, como esperábamos <img src='http://www.cprieto.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://www.cprieto.com/wp-content/uploads/2010/07/Powershell20100706_19.28.20.png" rel="lightbox[235]"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Powershell-2010-07-06_19.28.20" border="0" alt="Powershell-2010-07-06_19.28.20" src="http://www.cprieto.com/wp-content/uploads/2010/07/Powershell20100706_19.28.20_thumb.png" width="615" height="487" /></a> </p>
<p>Para saber un poco más acerca de convert, basta con <a href="http://mercurial.selenic.com/wiki/ConvertExtension">la página del wiki de Mercurial</a> <img src='http://www.cprieto.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/16-BTFWZl60" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cprieto.com/index.php/2010/07/06/cambiando-el-usuario-de-un-commit-en-mercurial/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.cprieto.com/index.php/2010/07/06/cambiando-el-usuario-de-un-commit-en-mercurial/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=cambiando-el-usuario-de-un-commit-en-mercurial</feedburner:origLink></item>
		<item>
		<title>.NET y Configuraciones – Parte 7</title>
		<link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/_kIHnkR_GTY/</link>
		<comments>http://www.cprieto.com/index.php/2010/07/05/net-y-configuraciones-parte-7/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 15:51:52 +0000</pubDate>
		<dc:creator>cristian</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[web.config]]></category>

		<guid isPermaLink="false">http://www.cprieto.com/index.php/2010/07/05/net-y-configuraciones-parte-7/</guid>
		<description><![CDATA[Bueno, luego de un largo tiempo de ausencia creo que es hora de continuar con la serie acerca de configuraciones en la .NET Framework. La última vez que conversamos mencionamos la capacidad que tenía una sección de configuración de validar los elementos de configuración, esta capacidad es netamente declarativa a partir de atributos que indican [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno, luego de un largo tiempo de ausencia creo que es hora de continuar con la serie acerca de configuraciones en la .NET Framework. La última vez que conversamos mencionamos la capacidad que tenía una sección de configuración de validar los elementos de configuración, esta capacidad es netamente declarativa a partir de atributos que indican el tipo de validación que debe llevarse a cabo. Como ustedes podrán imaginarse existirán situaciones donde es necesario realizar validaciones afuera de las que ya nos trae la configuration framework.</p>
<p>Existen dos formas de especificar o crear nuestras propias rutinas de validación de la configuración: mediante <em>validation callback</em> y utilizando <em>custom validation attributes</em>. Veremos ambas en esta serie y comenzaremos con la primera: <em>validation callbacks</em></p>
<h3>Validation Callbacks</h3>
<p>Imaginemos el siguiente caso hipotético, nuestra sección de validación requiere que se ingrese el nombre o host de la aplicación y el puerto para ese host, la sección en cuestión se vería algo así:</p>
<pre class="brush: csharp;wrap-lines: false">using System.Configuration;

namespace Cprieto.Samples {
    public class SampleConfigurationSection : ConfigurationSection {
        [ConfigurationProperty(&quot;port&quot;, DefaultValue = 80)]
        public int Port {
            get { return (int) this[&quot;port&quot;]; }
        }

        [ConfigurationProperty(&quot;host&quot;, IsRequired = true)]
        public string Host {
            get { return (string) this[&quot;host&quot;]; }
        }
    }
}</pre>
<p>Bien, ahora imaginemos que por alguna razón especial el puerto no debe ser ni el 110 ni el 23 (o podría ser cualquier otra regla que a uno se le ocurra). Una forma sencilla de realizar esta validación es usando un <em>método callback</em>, la idea es sencilla, cuando la framework obtenga el valor ejecutará el método o callback de validación pasando ese valor (o el por defecto) como parámetro, dentro del método (o callback en este caso) si no se cumple el requerimiento o validación, se arroja una <code><a href="http://msdn.microsoft.com/en-us/library/system.argumentexception.aspx">ArgumentException</a></code>. Los requerimientos del <em>callback method</em> son sencillos: Debe ser público, estático, ser de tipo void (o una Sub en Visual Basic) y tener un parámetro tipo Object (que recibe el valor a validar). Nuestra simple callback de ejemplo sería algo así:</p>
<pre class="brush: csharp;wrap-lines: false">using System;

namespace Cprieto.Samples {
    public class PortValidator {
        public static void Validate(object value) {
            var num = Convert.ToInt32(value);
            if (num == 110 || num == 23)
                throw new ArgumentException(&quot;port must not be 110 or 23&quot;);
        }
    }
}</pre>
<p>Ahora simplemente le decimos declarativamente a la sección de configuración que use ese callback basta con adornar el elemento con el atributo <code><a href="http://msdn.microsoft.com/en-us/library/system.configuration.callbackvalidatorattribute.aspx">CallbackValidatorAttribute</a></code></p>
<pre class="brush: csharp; highlight: [5];wrap-lines: false">using System.Configuration;

namespace Cprieto.Samples {
    public class SampleConfigurationSection : ConfigurationSection {
        [CallbackValidator(Type = typeof(PortValidator), CallbackMethodName = &quot;Validate&quot;)]
        [ConfigurationProperty(&quot;port&quot;, DefaultValue = 80)]
        public int Port {
            get { return (int) this[&quot;port&quot;]; }
        }

        [ConfigurationProperty(&quot;host&quot;, IsRequired = true)]
        public string Host {
            get { return (string) this[&quot;host&quot;]; }
        }
    }
}</pre>
<p>Es importante que recordemos pasar el tipo del validador (o sea, la clase que lo contiene) y el nombre de la función de callback</p>
<p>Para probar nuestro validador basta con usar el siguiente app.config</p>
<pre class="brush: xml;wrap-lines: false">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
&lt;configuration&gt;
  &lt;configSections&gt;
    &lt;section name=&quot;sample&quot;
             type=&quot;Cprieto.Samples.SampleConfigurationSection, Cprieto.Samples.ValidationCallback&quot;/&gt;
  &lt;/configSections&gt;
  &lt;sample port=&quot;110&quot; host=&quot;localhost&quot; /&gt;
&lt;/configuration&gt;</pre>
<p>Bien, como dijo <a href="http://en.wikipedia.org/wiki/Porky_Pig">Porky</a>&#8230; los dejo hasta la siguiente entrega donde continuaremos hablando de validadores en las configuraciones de la .Net Framework, Saludos miles a todos <img src='http://www.cprieto.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/_kIHnkR_GTY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cprieto.com/index.php/2010/07/05/net-y-configuraciones-parte-7/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.cprieto.com/index.php/2010/07/05/net-y-configuraciones-parte-7/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=net-y-configuraciones-parte-7</feedburner:origLink></item>
		<item>
		<title>Lanzamiento de la Comunidad y Visual Studio 2010</title>
		<link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/O7XgykETzPY/</link>
		<comments>http://www.cprieto.com/index.php/2010/06/16/lanzamiento-de-la-comunidad-y-visual-studio-2010/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 18:37:41 +0000</pubDate>
		<dc:creator>cristian</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[comunidad]]></category>
		<category><![CDATA[evento]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[silverlight]]></category>
		<category><![CDATA[visual studio]]></category>
		<category><![CDATA[wpf]]></category>

		<guid isPermaLink="false">http://www.cprieto.com/index.php/2010/06/16/lanzamiento-de-la-comunidad-y-visual-studio-2010/</guid>
		<description><![CDATA[Como ustedes habrán notado la comunidad ha estado en un estado de &#34;pausa&#34; por los últimos meses. Para aprovechar el momentum hemos estado organizando un evento de lanzamiento para Visual Studio 2010 a nivel comunitario. Los dejo con la información Lugar: Oficinas de Microsoft, Edificio Torre Citibank (Intercontinental) [3a Avenida 13-78 Zona 10, Of 1101, [...]]]></description>
			<content:encoded><![CDATA[<p>Como ustedes habrán notado la comunidad ha estado en un estado de &quot;pausa&quot; por los últimos meses. Para aprovechar el momentum hemos estado organizando un evento de lanzamiento para Visual Studio 2010 a nivel comunitario. Los dejo con la información <img src='http://www.cprieto.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<p><b></b></p>
<p><em><b>Lugar:</b> Oficinas de Microsoft, Edificio Torre Citibank (Intercontinental) [3a Avenida 13-78 Zona 10, Of 1101, Guatemala]</em></p>
<p><em><b>Fechas:</b> Miércoles 23, Jueves 24, Viernes 25 de Julio</em></p>
<p><em><b>Horas:</b> de <u>6pm a 9pm</u></em></p>
<h2>Expositores y temas</h2>
<h4>Silverlight/WPF 4.0 Development</h4>
<p><em><strong>Expositor:</strong> Carlos Lone, Microsoft MVP Client Application Development, </em><a href="http://www.asp.net/"><em>http://weblogs.asp.net/carloslone/</em></a></p>
<p><em><strong>Fecha:</strong> Miércoles 23 de Junio</em></p>
<p>La nueva era de websites en el internet cada vez más demandan la inclusión de una mejor experiencia de usuario (UX) en donde la interactividad, contenido multimedia y uso del sitio sea más sencillo y amigable para los usuarios.</p>
<p>Se ha dicho de que las versiones anteriores de Silverlight estaban muy orientadas a relizar animaciones y a presentar imagenes&#160; y videos con mejor definición. Sin embargo desde la versión 3.0 y ahora en la versión 4.0 la capacidad de poder utilizar esta herramienta para hacer aplicaciones de linea de negocio es cada vez más sencillo.</p>
<p>Acompañanos a descubrir todas las novedades de Silverlight y WPF en VS2010</p>
<p>- Demistificando Silverlight y WPF 4.0</p>
<p>- Novedades</p>
<p>- Construcción de aplicaciones de linea de negocio.</p>
<p>- Construiremos una aplicación 0 a 100.</p>
<h4>Sharepoint 2010 Development</h4>
<p><em><strong>Expositor:</strong> Manolo Herrera, Microsoft MVP Sharepoint, </em><a href="http://jmhogua.blogspot.com/"><em>http://jmhogua.blogspot.com/</em></a></p>
<p><em><strong>Fecha:</strong> Jueves 24 de Junio</em></p>
<p>El desarrollo en SharePoint nunca antes ha sido tan fácil y práctico</p>
<p>- Desarrollando en Web Part Visual para SharePoint en 15 minutos</p>
<p>- Depurando e instalando tu código en SharePoint desde Visual Studio con presionar una sola tecla.</p>
<p>- Descubriendo el nuevo Developer Dashboard de SharePoint</p>
<p>- Conociendo el Client Object Model de SharePoint desde un aplicación Windows.</p>
<p>- Creando una Sandbox Solution para que nos sirve y ayuda.</p>
<h4>Web development con ASP.NET 4.0</h4>
<p><em><strong>Expositor:</strong> Cristian Prieto, Microsoft MVP </em><em>ASP.NET</em><em>, </em><a href="http://www.cprieto.com"><em>http://www.cprieto.com</em></a></p>
<p><em><strong>Fecha:</strong> Viernes 25 de Junio</em></p>
<p>ASP.NET ha evolucionado muchísimo en los últimos años con la adición de ASP.NET MVC y Dynamic Data, además de las mejoras continuas a la plataforma de WebForms y ASP.NET AJAX. Hablaremos de como aumentar la productividad y al mismo tiempo construir aplicaciones web que manejen de una manera transparente CSS, controles finos sobre el renderizado y markup al mismo tiempo que podemos mejorar SEO y muchas otras características nuevas en <a href="http://ASP.NET">ASP.NET</a> 4.0</p>
<p>&#160;</p>
<p><strong>El cupo es limitado, así que sugiero que corran al link de registro y aparten su lugar </strong><a href="http://bit.ly/launchgt"><strong>http://bit.ly/launchgt</strong></a></p>
<p> ¡Espero verlos en el lanzamiento!</p>
<p><strong>NOTA:</strong> Recuerden imprimir y llevar al evento el ticket de inscripción que se genera en el momento del registro</p>
<p>Saludos,</p>
<img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/O7XgykETzPY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cprieto.com/index.php/2010/06/16/lanzamiento-de-la-comunidad-y-visual-studio-2010/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.cprieto.com/index.php/2010/06/16/lanzamiento-de-la-comunidad-y-visual-studio-2010/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=lanzamiento-de-la-comunidad-y-visual-studio-2010</feedburner:origLink></item>
		<item>
		<title>.NET y Configuraciones – Parte 6</title>
		<link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/HnCexwi8Mjs/</link>
		<comments>http://www.cprieto.com/index.php/2010/06/15/net-y-configuraciones-parte-6/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 23:24:41 +0000</pubDate>
		<dc:creator>cristian</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[basic]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[web dev]]></category>
		<category><![CDATA[web.config]]></category>

		<guid isPermaLink="false">http://www.cprieto.com/index.php/2010/06/15/net-y-configuraciones-parte-6/</guid>
		<description><![CDATA[Bueno, miren que lejos hemos llegado con el asunto de las configuraciones pero no se preocupen, aún falta mucho más que aprender sobre nuestros amigos los archivos app/web.config y sobre nuestras configuraciones personalizadas, imagínense un mundo con menos y con configuraciones más claras y con mayor significado para el desarrollador. Hasta el momento hemos explorado [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno, miren que lejos hemos llegado con el asunto de las configuraciones <img src='http://www.cprieto.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  pero no se preocupen, aún falta mucho más que aprender sobre nuestros amigos los archivos app/web.config y sobre nuestras configuraciones personalizadas, imagínense un mundo con menos <appsettings></appsettings>y con configuraciones más claras y con mayor significado para el desarrollador. Hasta el momento hemos explorado <a href="http://www.cprieto.com/index.php/2010/06/01/net-y-configuraciones-parte-2/">secciones</a>, <a href="http://www.cprieto.com/index.php/2010/06/02/net-y-configuraciones-parte-3/">grupos de secciones</a>, <a href="http://www.cprieto.com/index.php/2010/05/31/net-y-configuraciones-parte-1/">elementos</a>, <a href="http://www.cprieto.com/index.php/2010/06/07/net-y-configuraciones-parte-4/">colecciones</a> todas personalizadas, hoy aprenderemos un poco acerca de validadores. </p>
<h3>Element Validators</h3>
<p>Imagínense que en su sistema de configuración necesitan validar que el número ingresado por el usuario en la configuración se encuentre dentro de un rango, o que el texto ingresado cumpla con una expresión regular o cumpla una longitud mínima o máxima (si, ya se, ambos se pueden lograr con un regex, pero para efectos de ejemplo digamos que son dos diferentes). Muchos quizás nos veremos tentados a obtener el valor de la configuración y <i>posteriormente</i> validarlo, bien, en el caso de elementos de configuración es buena idea abstenerse de hacerlo. La buena noticia es que tenemos a nuestra disposición toda una infraestructura de validación de valores de configuración y esta se lleva a cabo en el momento en que el <code><a href="http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx">ConfigurationManager</a></code> lee los valores. </p>
<p>Los <code>Validators</code> son atributos especiales que acompañan a nuestros elementos de configuración, podemos definir nuestros propios validadores (ese será el tema de un post futuro) pero por defecto la framework nos empaca un par de validadores simples y sencillos: </p>
<table>
<tbody>
<tr>
<td><a href="http://msdn.microsoft.com/en-us/library/system.configuration.integervalidatorattribute.aspx">IntegerValidator</a></td>
<td>Valida un entero dentro de un rango</td>
</tr>
<tr>
<td><a href="http://msdn.microsoft.com/en-us/library/system.configuration.longvalidator.aspx">LongValidator</a></td>
<td>Valida un número dentro de un rango</td>
</tr>
<tr>
<td><a href="http://msdn.microsoft.com/en-us/library/system.configuration.positivetimespanvalidator.aspx">PositiveTimeSpanValidator</a></td>
<td>Valida un timespan dentro de un rango positivo</td>
</tr>
<tr>
<td><a href="http://msdn.microsoft.com/en-us/library/system.configuration.regexstringvalidator.aspx">RegexStringValidator</a></td>
<td>Valida que una cadena cumple con una expresión regular</td>
</tr>
<tr>
<td><a href="http://msdn.microsoft.com/en-us/library/system.configuration.stringvalidator.aspx">StringValidator</a></td>
<td>Valida que una cadena debe cumplir una longitud máxima/mínima</td>
</tr>
<tr>
<td><a href="http://msdn.microsoft.com/en-us/library/system.configuration.timespanvalidator.aspx">TimeSpanValidator</a></td>
<td>Valida un timespan dentro de un rango</td>
</tr>
</tbody>
</table>
<p>Usar los validadores no puede ser más sencillo, simplemente adornamos nuestras propiedades o elementos con el atributo del validador que nos interesa y la framework de configuración se encarga del resto </p>
<pre class="brush: csharp; highlight: [7,17,18];">using System;
using System.Configuration;

namespace Samples {
    public class SampleConfigurationSection : ConfigurationSection {
        [ConfigurationProperty(&quot;port&quot;, DefaultValue = 80)]
        [IntegerValidator(MaxValue = 100, MinValue = 20)]
        public int Port {
            get { return (int) this[&quot;port&quot;]; }
        }

        [ConfigurationProperty(&quot;host&quot;, IsRequired = true)]
        public string Host {
            get { return (string) this[&quot;host&quot;]; }
        }

        [ConfigurationProperty(&quot;timeout&quot;)]
        [TimeSpanValidator(MinValueString = &quot;00:00:00&quot;,
            MaxValueString = &quot;00:01:00&quot;)]
        public TimeSpan Timeout {
            get { return (TimeSpan) this[&quot;timeout&quot;]; }
        }
    }
}</pre>
<p>Para probar la configuración podemos usar este simple <config>app.config</config> </p>
<pre class="brush: xml;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
&lt;configuration&gt;
  &lt;configSections&gt;
    &lt;section name=&quot;sample&quot; type=&quot;Samples.SampleConfigurationSection, ValidatorSample&quot;/&gt;
  &lt;/configSections&gt;
  &lt;sample host=&quot;localhost&quot; port=&quot;80&quot; timeout=&quot;00:00:30&quot; /&gt;
&lt;/configuration&gt;</pre>
<p>Y este pequeño programa de consola puede servirnos como simple prueba</p>
<pre class="brush: csharp;">using System;
using System.Configuration;

namespace Samples {
    internal class Program {
        private static void Main(string[] args) {
            var cfg = ConfigurationManager.GetSection(&quot;sample&quot;)
                as SampleConfigurationSection;
            if (cfg == null)
                return;

            Console.WriteLine(&quot;Host: {0}, Port: {1}, Timeout: {2}&quot;,
                cfg.Host, cfg.Port, cfg.Timeout);

            Console.ReadLine();
        }
    }
}</pre>
<p>Si algún elemento no cumple con lo esperado por el validador el <code>ConfigurationManager</code> tirará una excepción de tipo <code><a href="http://msdn.microsoft.com/en-us/library/system.configuration.configurationerrorsexception.aspx">ConfigurationErrorsException</a></code> que a su vez en la propiedad <code>Errors</code> contendrá los <code><a href="http://msdn.microsoft.com/en-us/library/system.configuration.configurationexception.aspx">ConfigurationException</a></code> en forma de arreglo. </p>
<img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/HnCexwi8Mjs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cprieto.com/index.php/2010/06/15/net-y-configuraciones-parte-6/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.cprieto.com/index.php/2010/06/15/net-y-configuraciones-parte-6/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=net-y-configuraciones-parte-6</feedburner:origLink></item>
	</channel>
</rss>
