<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Programación .porExpertos</title>
	<atom:link href="http://programacion.porexpertos.es/feed/" rel="self" type="application/rss+xml" />
	<link>http://programacion.porexpertos.es</link>
	<description>Conocimiento de programación a tu alcance</description>
	<lastBuildDate>Fri, 27 Jan 2012 18:05:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Mantener posición del scroll en Chrome</title>
		<link>http://programacion.porexpertos.es/mantener-posicion-del-scroll-en-chrome/</link>
		<comments>http://programacion.porexpertos.es/mantener-posicion-del-scroll-en-chrome/#comments</comments>
		<pubDate>Fri, 24 Jun 2011 10:10:57 +0000</pubDate>
		<dc:creator>Eva Higueras</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP .Net]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Scroll]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://programacion.porexpertos.es/?p=511</guid>
		<description><![CDATA[Cuando desarrollamos páginas Web en .Net, habitualmente utilizamos la propiedad MaintainScrollPositionOnPostback para que al volver de un postback de la página, la posición del scroll se mantenga. Esto evita que el usuario pierda su posición, y se desoriente, cuando trabaja con páginas con scroll vertical. Esta propiedad se suele poner en el evento Page_Load de [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando desarrollamos páginas Web en .Net, habitualmente utilizamos la propiedad <strong>MaintainScrollPositionOnPostback </strong>para que al volver de un postback de la página, la posición del scroll se mantenga. Esto evita que el usuario pierda su posición, y se desoriente, cuando trabaja con páginas con scroll vertical.<br />
Esta propiedad se suele poner en el evento Page_Load de las páginas: </p>
<pre>
protected void Page_Load(object sender, EventArgs e)
{
      Page.MaintainScrollPositionOnPostBack = true;
}
</pre>
<p>Esta propiedad funciona correctamente en IExplorer, pero no funciona en todos los navegadores, como por ejemplo, en <strong>Chrome</strong>. Para que funcione en Chrome, debemos incluir un archivo de exploradores (<strong>Browser File</strong>) en nuestro proyecto.<br />
Este es un archivo especial que podemos añadir a nuestra solución desde Visual Studio, desde el dialogo de Añadir Nuevo Elemento. El archivo de navegadores tendrá extensión <em><strong>.browser</strong></em>, y se colocará en la carpeta <strong>APP_BROWSERS</strong>.<br />
Debemos incorporar lo siguiente para que la posición del Scroll se mantenga en los postback de las páginas: </p>
<pre>
</pre>
<p>Como podéis observar, el identificador del navegador que hay que utilizar para que funcione con Chrome, es <strong>Safari1Plus</strong>.<br />
Para averiguar si el navegador sobre el que estamos ejecutando nuestra aplicación soporta por defecto esta propiedad, así como el identificador que debemos utilizar, y el resto de capacidades que tiene, podemos consultar las propiedades del objeto <strong>Request.Browser.</strong> </p>
<pre>
System.Web.HttpBrowserCapabilities browser = Request.Browser;
</pre>
<p>Para más información, MSDN:<br />
<a href="http://msdn.microsoft.com/en-us/library/ms228122.aspx">Browser Definition File Schema (browsers Element)</a><br />
<a href="http://msdn.microsoft.com/en-us/library/3yekbd5b.aspx">How to: Detect Browser Types and Browser Capabilities in ASP.NET Web Pages</a></p>
]]></content:encoded>
			<wfw:commentRss>http://programacion.porexpertos.es/mantener-posicion-del-scroll-en-chrome/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Validación de peticiones</title>
		<link>http://programacion.porexpertos.es/validacion-de-peticiones/</link>
		<comments>http://programacion.porexpertos.es/validacion-de-peticiones/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 13:53:20 +0000</pubDate>
		<dc:creator>Eva Higueras</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[ASP .Net]]></category>
		<category><![CDATA[Validación]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://programacion.porexpertos.es/?p=474</guid>
		<description><![CDATA[ASP .Net realiza una validación de los datos que se envían al servidor para evitar que se envíen datos que considere no &#8220;seguros&#8221;, y evitar de esta manera posibles ataques. Si por ejemplo, ponemos una etiqueta HTML en un textbox, se lanzará la siguiente excepción: Error de servidor en la aplicación &#8216;/WebPruebas&#8217;. Se detectó un [...]]]></description>
			<content:encoded><![CDATA[<p>ASP .Net realiza una validación de los datos que se envían al servidor para evitar que se envíen datos que considere no &#8220;seguros&#8221;, y evitar de esta manera posibles ataques. Si por ejemplo, ponemos una etiqueta HTML en un textbox, se lanzará la siguiente excepción: </p>
<div style="border: solid;1px;gray;padding:10px">
<h1 style="font-family:Verdana;font-size: 14pt;color:red;line-height:1.6em">Error de servidor en la aplicación &#8216;/WebPruebas&#8217;.</p>
<hr width="100%" size="1"></h1>
<p style="font-family:Verdana;font-size: 10pt;color:maroon;line-height:1.6em"><em><br />
Se detectó un posible valor Request.Form peligroso en el cliente (TextBox1=&#8221;"). </em></p>
<p style="line-height:1.6em;font-family:Verdana;font-size: 7pt">
<strong>Descripción</strong>: La validación de solicitudes ha detectado un posible valor de entrada del cliente peligroso, y se ha anulado el procesamiento de la solicitud. Este valor puede indicar un intento de comprometer la seguridad de la aplicación, como un ataque XSS. Puede deshabilitar la validación de solicitudes estableciendo validateRequest=false en la directiva de la página o en la sección de configuración de . Sin embargo, se recomienda que la aplicación compruebe explícitamente todas las entradas en este caso.
</p>
<p style="line-height:1.6em;font-family:Verdana;font-size: 7pt">
<strong>Detalles de la excepción</strong>: System.Web.HttpRequestValidationException: Se detectó un posible valor Request.Form peligroso en el cliente (TextBox1=&#8221;").
</p>
<p>&#8230;
</p></div>
<p>
Hasta ahora evitábamos esto deshabilitando la validación en la página a través de la propiedad ValidateRequest de la directiva Page: </p>
<pre>
</pre>
<p>Pero sería más óptimo deshabilitar la validación sólo para aquellos campos en los que necesitemos que se puedan introducir este tipo de textos. Para ello, deberemos únicamente cambiar el nombre de nuestro control y ponerle dos guiones bajos delante.</p>
<pre>
</pre>
<p>Podéis ampliar la información en este post de la Web VARIABLE NOT FOUND: </p>
<p>http://www.variablenotfound.com/2010/09/validacion-de-peticiones-en-aspnet-o.html</p>
]]></content:encoded>
			<wfw:commentRss>http://programacion.porexpertos.es/validacion-de-peticiones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Infragistics. Destacar fila seleccionada</title>
		<link>http://programacion.porexpertos.es/infragistics-destacar-fila-seleccionada/</link>
		<comments>http://programacion.porexpertos.es/infragistics-destacar-fila-seleccionada/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 13:26:48 +0000</pubDate>
		<dc:creator>Eva Higueras</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Infragistics]]></category>
		<category><![CDATA[AppStylist]]></category>
		<category><![CDATA[ASP .Net]]></category>
		<category><![CDATA[estilos]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://programacion.porexpertos.es/?p=310</guid>
		<description><![CDATA[Cuando utilizamos las rejillas de Infragistics en WEB, suelo aplicarles los estilos generados por la herramienta Infragistics35.Web.AppStylist, que posteriormente ubicamos en la carpeta IG_RES del proyecto. Estos estilos en ocasiones afectan a determinados comportamientos de las rejillas, por lo que es necesario analizar el código, y modificarlo en consecuencia. En este caso, el problema surgió con [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal"><span>Cuando utilizamos las rejillas de Infragistics en WEB, suelo aplicarles los estilos </span>generados por la herramienta Infragistics35.Web.AppStylist, que posteriormente ubicamos en la carpeta IG_RES del proyecto. Estos estilos en ocasiones afectan a determinados comportamientos de las rejillas, por lo que es necesario analizar el código, y modificarlo en consecuencia. En este caso, el problema surgió con la selección de filas de las rejillas.</p>
<p class="MsoNormal"><span>Al aplicar estos estilos, al seleccionar una fila desde la web, esta no aparece destacada, si no que se muestra una flecha en el lateral de la fila.</span></p>
<div id="attachment_449" class="wp-caption aligncenter" style="width: 351px"><img class="size-full wp-image-449" src="http://programacion.porexpertos.es/files/2012/01/15-06-2011-13-10-37.png" alt="Rejilla fila seleccionada" width="341" height="133" /><p class="wp-caption-text">Rejilla fila seleccionada</p></div>
<p class="MsoNormal"><span>Si esta rejilla la configuramos para que se muestre la numeración de las filas (en displayLayout, </span><strong><span>AllowRowNumberingDefault</span><span>=&#8221;Continuous&#8221;</span></strong><span>), la flecha que marca la fila seleccionada deja de aparecer.</span></p>
<p class="MsoNormal">Para indicarle al usuario qué fila es la que está seleccionada, tanto si tenemos habilitada como si no la numeración de las filas, debemos indicar en la propiedad <strong>SelectTypeRowDefault</strong> el tipo de selección que haremos (Single &#8211; una única fila ; Extended &#8211; Múltiples filas)</p>
<pre>

[...]</pre>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span>De esta manera, las filas aparecerán destacadas en la rejilla, esté o no habilitada la opción de numeración de filas. </span></p>
<div id="attachment_448" class="wp-caption aligncenter" style="width: 340px"><img class="size-full wp-image-448" src="http://programacion.porexpertos.es/files/2012/01/15-06-2011-13-05-49.png" alt="Rejilla Fila destacada" width="330" height="137" /><p class="wp-caption-text">Rejilla Fila destacada</p></div>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal">(Infragistics 2008)</p>
<p class="MsoNormal"><span> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://programacion.porexpertos.es/infragistics-destacar-fila-seleccionada/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Publicación de Sitios Web y el namespace ASP</title>
		<link>http://programacion.porexpertos.es/publicacion-de-sitios-web-y-el-namespace-asp/</link>
		<comments>http://programacion.porexpertos.es/publicacion-de-sitios-web-y-el-namespace-asp/#comments</comments>
		<pubDate>Thu, 09 Jun 2011 11:49:48 +0000</pubDate>
		<dc:creator>Eva Higueras</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP .Net]]></category>
		<category><![CDATA[ensamblado]]></category>
		<category><![CDATA[namespace]]></category>
		<category><![CDATA[precompilado]]></category>
		<category><![CDATA[publicación]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://programacion.porexpertos.es/?p=385</guid>
		<description><![CDATA[Cuando trabajamos con aplicaciones Web de .Net, a la hora de subir la aplicación al servidor de producción, esta debe ir precompilada para optimizar los tiempos de ejecución, y no subir directamente nuestro código al servidor, entre otras muchas razones. Cuando realizamos esta publicación, si hemos utilizado el namespace ASP, podemos tener algunos problemas. Primero, [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal">Cuando trabajamos con aplicaciones Web de .Net, a la hora de subir la aplicación al servidor de producción, esta debe ir precompilada para optimizar los tiempos de ejecución, y no subir directamente nuestro código al servidor, entre otras muchas razones. Cuando realizamos esta publicación, si hemos utilizado el namespace ASP, podemos tener algunos problemas.</p>
<p class="MsoNormal">Primero, enumeramos las alternativas que nos proporciona Visual Studio 2008 para realizar este precompilado. La precompilación la realizaremos desde la opción de Publicar Sitio Web.</p>
<ul>
<li><strong>Permitir que este sitio precompilado se actualice</strong></li>
</ul>
<p style="padding-left: 60px"><span style="text-decoration: underline">Habilitado</span>: Los archivos ASPX (.aspx, .ascx, .master&#8230;) no se compilaran y se copiaran tal cual, sólo se incluirá en ellos una referencia al ensamblado en el que se encuentra el código correspondiente a su archivo CS asociado.</p>
<p style="padding-left: 60px"><span style="text-decoration: underline">Deshabilitado</span>: Los archivos ASPX se compilan y por lo tanto, no se puede ni ver ni modificar su código en la web una vez ésta está generada.</p>
<ul>
<li><strong>Utilizar nomenclatura fija y ensamblados de una sola página</strong></li>
</ul>
<p style="padding-left: 60px"><span style="text-decoration: underline">Habilitado</span>: Se genera un ensamblado por cada una de las páginas, por lo que se debe limitar el número de páginas del proyecto. El nombre de cada ensamblado se corresponde con la ruta virtual de la página, y en caso de que esta sea excesivamente larga, con un código HASH. El nombre de los ensamblados siempre es el mismo.</p>
<p style="padding-left: 60px"><span style="text-decoration: underline">Deshabilitado</span>: Se genera un ensamblado por cada lote de archivos (en función de la carpeta en que esté, etc.). El nombre de los ensamblados de lote varía cada vez que se realiza una publicación.</p>
<ul>
<li><strong>Habilitar nombre seguro en los ensamblados precompilados</strong></li>
</ul>
<p style="padding-left: 60px"><span style="text-decoration: underline">Habilitado</span>: Permite que se especifique un archivo de claves para generar los nombres de los ensamblados y poder asegurar que no se han alterado.</p>
<p style="padding-left: 60px"><span style="text-decoration: underline">Deshabilitado</span>: Los nombres se general de forma normal.</p>
<p style="padding-left: 60px">
<p>Ahora, si hemos utilizado el <strong>namespace ASP</strong>, al ir a realizar la publicación de un sitio Web, debemos tener en cuenta lo siguiente:  el namespace ASP se asigna por defecto a las clases vinculadas a los archivos de interfaz (ascx, aspx, etc.)  Si realizamos alguna llamada en nuestro código a este namespace en la publicación, si marcamos la opción <strong><em>Permitir que este sitio precompilado se actualice</em></strong>, se producirá un error de este estilo:</p>
<p><span style="color: maroon"><strong>El tipo o el nombre del espacio de nombres &#8216;nombreControl&#8217; no existe en el espacio de nombres &#8216;ASP&#8217; (¿falta una referencia de ensamblado?)</strong></span></p>
<p>Para solucionarlo, tenemos las siguientes opciones:</p>
<ul>
<li>Desmarcar la opción Permitir que este sitio precompilado se actualice.</li>
</ul>
<ul>
<li>Utilizar un ensamblado propio.</li>
</ul>
<p>Para utilizar un namespace propio en lugar del namespace ASP, deberemos indicar en el archivo control.ascx el nombre del nuevo namespace, forzando de esta manera que se utilice nuestro namespace en lugar del namespace por defecto<em>:</em></p>
<pre>
</pre>
<p>Por otro lado, en el archivo que contiene la clase asociada, <em>control.ascx.cs</em>, indicaremos el namespace:<em> </em></p>
<pre>namespace Proyecto.NameSpacePropio
{
public partial class control : System.Web.UI.UserControl
{...</pre>
<p>Y por último, en el archivo donde hacíamos referencia al namespace ASP, incluiremos una referencia al nuevo ensamblado:</p>
<pre>using Proyecto.NameSpacePropio;</pre>
<p><!--[endif]--></p>
]]></content:encoded>
			<wfw:commentRss>http://programacion.porexpertos.es/publicacion-de-sitios-web-y-el-namespace-asp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Evitar que un objeto Flash quede por encima</title>
		<link>http://programacion.porexpertos.es/evitar-que-un-objeto-flash-quede-por-encima/</link>
		<comments>http://programacion.porexpertos.es/evitar-que-un-objeto-flash-quede-por-encima/#comments</comments>
		<pubDate>Thu, 09 Jun 2011 10:53:18 +0000</pubDate>
		<dc:creator>Eva Higueras</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[banner]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[modal]]></category>
		<category><![CDATA[superposición de capas]]></category>
		<category><![CDATA[wmode]]></category>

		<guid isPermaLink="false">http://programacion.porexpertos.es/?p=349</guid>
		<description><![CDATA[Cuando trabajamos con objetos Flash en aplicaciones Web, estos suelen quedar por encima del resto de objetos de la página. Por ejemplo, al colocar un banner realizado en flash en la página, si después queremos mostrar un panel simulando una ventana modal que quede por encima del resto de objetos de la página, el flash [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando trabajamos con objetos Flash en aplicaciones Web, estos suelen quedar por encima del resto de objetos de la página. Por ejemplo, al colocar un banner realizado en flash en la página, si después queremos mostrar un panel simulando una ventana modal que quede por encima del resto de objetos de la página, el flash aparecerá por defecto delante de este panel.</p>
<p>Para evitar que esto ocurra, debemos hacer uso de la propiedad <strong>wmode</strong>,<strong><span style="font-size: small"><span style="color: #0000ff"><span style="color: #0000ff"> </span></span></span></strong>con el valor  <strong><strong>transparent</strong></strong>. Esta propiedad nos permitirá ubicar el flash por detrás del objeto que necesitemos superponer.</p>
<p><span><span style="color: #0000ff;font-size: small"><span style="color: #0000ff;font-size: small">&lt;</span></span><span style="color: #a31515"><span style="color: #a31515;font-size: small">object </span></span><span style="color: #ff0000"><span style="color: #ff0000">width</span></span><span style="color: #0000ff;font-size: small"><span style="color: #0000ff">=&#8221;730&#8243;</span></span><span style="font-size: small"> </span><span style="color: #ff0000"><span style="color: #ff0000;font-size: small">height</span></span><span style="color: #0000ff"><span style="color: #0000ff;font-size: small">=&#8221;65&#8243;&gt;</span></span></span></p>
<p style="padding-left: 30px"><span><span style="color: #0000ff"><span style="color: #0000ff;font-size: small">&lt;</span></span><span style="color: #a31515"><span style="color: #a31515;font-size: small">param </span></span><span style="color: #ff0000"><span style="color: #ff0000">name</span></span><span style="color: #0000ff"><span style="color: #0000ff;font-size: small">=&#8221;movie&#8221; </span></span><span style="color: #ff0000"><span style="color: #ff0000;font-size: small">value</span></span><span style="color: #0000ff"><span style="color: #0000ff">=&#8217;banner.swf</span></span><span style="color: #0000ff"><span style="color: #0000ff">&#8216;&gt;&lt;/</span></span><span style="color: #a31515"><span style="color: #a31515">param</span></span><span style="color: #0000ff"><span style="color: #0000ff">&gt;<br />
</span></span><span style="color: #0000ff"><span style="color: #0000ff"> &lt;</span></span><span style="color: #a31515"><span style="color: #a31515">param </span></span><span style="color: #ff0000"><span style="color: #ff0000">name</span></span><span style="color: #0000ff"><span style="color: #0000ff">=&#8221;allowFullScreen&#8221; </span></span><span style="color: #ff0000"><span style="color: #ff0000">value</span></span><span style="color: #0000ff"><span style="color: #0000ff">=&#8221;false&#8221;&gt;&lt;/</span></span><span style="color: #a31515"><span style="color: #a31515">param</span></span><span style="color: #0000ff"><span style="color: #0000ff">&gt;<br />
</span></span><span style="color: #0000ff"><span style="color: #0000ff"> &lt;</span></span><span style="color: #a31515"><span style="color: #a31515">param </span></span><span style="color: #ff0000"><span style="color: #ff0000">name</span></span><span style="color: #0000ff"><span style="color: #0000ff">=&#8221;allowscriptaccess&#8221; </span></span><span style="color: #ff0000"><span style="color: #ff0000">value</span></span><span style="color: #0000ff"><span style="color: #0000ff">=&#8221;always&#8221;&gt;&lt;/</span></span><span style="color: #a31515"><span style="color: #a31515">param</span></span><span style="color: #0000ff"><span style="color: #0000ff">&gt;<br />
</span></span><strong><span style="font-size: small"><span style="color: #0000ff"><span style="color: #0000ff"> &lt;</span></span><span style="color: #a31515"><span style="color: #a31515">param</span></span> <span style="color: #ff0000"><span style="color: #ff0000">name</span></span><span style="color: #0000ff"><span style="color: #0000ff">=&#8221;wmode&#8221;</span></span> <span style="color: #ff0000"><span style="color: #ff0000">value</span></span><span style="color: #0000ff"><span style="color: #0000ff">=&#8221;transparent&#8221;&gt;&lt;/</span></span><span style="color: #a31515"><span style="color: #a31515">param</span></span><span style="color: #0000ff"><span style="color: #0000ff">&gt;<br />
</span></span></span></strong><span style="color: #0000ff"><span style="color: #0000ff">&lt;</span></span><span style="color: #a31515"><span style="color: #a31515">embed </span></span><span style="color: #ff0000"><span style="color: #ff0000">src</span></span><span style="color: #0000ff"><span style="color: #0000ff">=&#8217;banner.swf<span style="color: #0000ff"><span style="color: #0000ff">&#8216; </span></span></span></span><span style="color: #ff0000"><span style="color: #ff0000">type</span></span><span style="color: #0000ff"><span style="color: #0000ff">=&#8221;application/x-shockwave-flash&#8221;</span></span><span><br />
</span><span style="color: #ff0000"><span style="color: #ff0000">allowscriptaccess</span></span><span style="color: #0000ff"><span style="color: #0000ff">=&#8221;always&#8221; </span></span><span style="color: #ff0000"><span style="color: #ff0000;">allowfullscreen</span></span><span style="color: #0000ff"><span style="color: #0000ff">=&#8221;false&#8221;</span></span><span><br />
</span><span style="color: #ff0000"><span style="color: #ff0000">width</span></span><span style="color: #0000ff"><span style="color: #0000ff">=&#8221;730&#8243; </span></span><span style="color: #ff0000"><span style="color: #ff0000">height</span></span><span style="color: #0000ff"><span style="color: #0000ff">=&#8221;65&#8243;</span></span><span><br />
</span><span style="color: #ff0000"><span style="color: #ff0000;font-size: small"><strong>wmode</strong></span></span><span style="color: #0000ff"><span style="color: #0000ff"><strong><span style="font-size: small">=&#8221;transparent&#8221;</span></strong>&gt;&lt;/</span></span><span style="color: #a31515"><span style="color: #a31515">embed</span></span><span style="color: #0000ff"><span style="color: #0000ff">&gt;</span></span></span></p>
<p><span><span style="color: #0000ff"><span style="color: #0000ff">&lt;/</span></span><span style="color: #a31515"><span style="color: #a31515">object</span></span><span style="color: #0000ff"><span style="color: #0000ff">&gt;</span></span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://programacion.porexpertos.es/evitar-que-un-objeto-flash-quede-por-encima/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Resolución del usuario, ancho y alto de la pantalla</title>
		<link>http://programacion.porexpertos.es/resolucion-del-usuario-ancho-y-alto-de-la-pantalla/</link>
		<comments>http://programacion.porexpertos.es/resolucion-del-usuario-ancho-y-alto-de-la-pantalla/#comments</comments>
		<pubDate>Fri, 03 Jun 2011 12:10:05 +0000</pubDate>
		<dc:creator>Eva Higueras</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[height]]></category>
		<category><![CDATA[pantalla]]></category>
		<category><![CDATA[resolución]]></category>
		<category><![CDATA[width]]></category>

		<guid isPermaLink="false">http://programacion.porexpertos.es/?p=314</guid>
		<description><![CDATA[Cuando trabajamos con interfaces web, en varias ocasiones necesitamos saber cuál es la resolución con la que está trabajando el usuario con el fin de poder presentar los datos de la mejor forma posible. Para ello, desde JavaScript, podemos obtener el ancho y el alto de la pantalla que el usuario está utilizando  (no el de [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando trabajamos con interfaces web, en varias ocasiones necesitamos saber cuál es la<strong> resolución</strong> con la que está trabajando el usuario con el fin de poder presentar los datos de la mejor forma posible.</p>
<p>Para ello, desde <strong>JavaScript</strong>, podemos obtener el <strong>ancho y el alto de la pantalla</strong> que el usuario está utilizando  (no el de la ventana del navegador, si no el de la pantalla). Lo haremos de la siguiente forma:</p>
<pre>var alto = screen.height;
var ancho = screen.width;</pre>
<p>Y para que funcione en <strong>Chrome y en Firefox</strong>, podremos lo siguiente:</p>
<pre>var ancho = screen.width + "px";</pre>
]]></content:encoded>
			<wfw:commentRss>http://programacion.porexpertos.es/resolucion-del-usuario-ancho-y-alto-de-la-pantalla/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web config dividido en varios archivos</title>
		<link>http://programacion.porexpertos.es/web-config-dividido-en-varios-archivos/</link>
		<comments>http://programacion.porexpertos.es/web-config-dividido-en-varios-archivos/#comments</comments>
		<pubDate>Fri, 03 Jun 2011 11:58:50 +0000</pubDate>
		<dc:creator>Eva Higueras</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[configsource]]></category>
		<category><![CDATA[configuracion]]></category>
		<category><![CDATA[producción]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Web Application]]></category>

		<guid isPermaLink="false">http://programacion.porexpertos.es/?p=317</guid>
		<description><![CDATA[Para dividir el web.config en varios archivos: Cuando trabajamos con aplicaciones Web, el archivo WEB.CONFIG contiene la configuración del proyecto, y esta configuración está dividida en varios bloques.  La división del WEB.CONFIG en varios archivos nos permite aislar estos bloques para facilitar su localización y actualización. Además, algunos de estos bloques son diferentes si estamos en [...]]]></description>
			<content:encoded><![CDATA[<p>Para dividir el web.config en varios archivos:</p>
<p>Cuando trabajamos con aplicaciones Web, el archivo WEB.CONFIG contiene la configuración del proyecto, y esta configuración está dividida en varios bloques.  La división del WEB.CONFIG en varios archivos nos permite aislar estos bloques para<strong> facilitar su localización y actualización</strong>.</p>
<p>Además, algunos de estos bloques son diferentes si estamos en el entorno de desarrollo, en el entorno de pre-producción, o en el entorno de producción, por lo que aislando las partes que sean propias de los <strong>diferentes entornos</strong> con los que trabajemos, <strong>facilitaremos las puestas en producción</strong>.</p>
<p>Para dividir el web.config en varios archivos debemos de utilizar la propiedad <strong>configSource</strong>, e indicar el nombre del archivo en el que está el bloque que hemos aislado. Por ejemplo, si queremos aislar el bloque de las cadenas de conexión, haremos lo siguiente:</p>
<h3>ARCHIVO WEB.CONFIG</h3>
<pre>
  [.....]

[.....]
</pre>
<h3>ARCHIVO CONEXION.CONFIG</h3>
<pre>
</pre>
<p>Si realizamos esta división, debemos tener en cuenta lo siguiente:</p>
<p>Cuando en un proyecto, que se está ejecutando, se realiza una modificación sobre el WEB.CONFIG, la aplicación se reinicia. Esto se produce porque <strong>hay determinadas partes del WEB.CONFIG que requieren que se fuerce un reinicio de la aplicación  si se realizan cambios sobre ellas</strong>. Esto viene establecido, a nivel de bloque,  en el MACHINE.CONFIG (con la variable restartOnExternalChanges a false para aquellos bloques que no requieren reinicio).</p>
<p>Si aislamos un bloque que no requiera que la aplicación se reinicie, por ejemplo, <strong>appSettings</strong>, conseguiremos que los cambios que se produzcan sobre este archivo no fuercen un reinicio de la aplicación.</p>
]]></content:encoded>
			<wfw:commentRss>http://programacion.porexpertos.es/web-config-dividido-en-varios-archivos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microsoft Unity Data Access Application Block &#8211; Ejemplos Básicos</title>
		<link>http://programacion.porexpertos.es/microsoft-unity-data-access-application-block-ejemplos-basicos/</link>
		<comments>http://programacion.porexpertos.es/microsoft-unity-data-access-application-block-ejemplos-basicos/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 09:07:57 +0000</pubDate>
		<dc:creator>Jorge Ruiz</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Data Access]]></category>
		<category><![CDATA[unity]]></category>

		<guid isPermaLink="false">http://programacion.porexpertos.es/?p=262</guid>
		<description><![CDATA[Microsoft Enterprise Library nos proporciona un bloque de aplicación denominado &#8220;acceso a datos&#8221; que nos ofrece una abstracción para la utilización de bases de datos. A continuación, mostraremos unos ejemplos de código fuente sencillo para permitir el acceso a una base de datos SQL Server. Deberíamos utilizar las siguientes referencias using: using Microsoft.Practices.EnterpriseLibrary.Data; using System.Data; [...]]]></description>
			<content:encoded><![CDATA[<p>Microsoft Enterprise Library nos proporciona un bloque de aplicación denominado &#8220;acceso a datos&#8221; que nos ofrece una abstracción para la utilización de bases de datos.</p>
<p>A continuación, mostraremos unos ejemplos de código fuente sencillo para permitir el acceso a una base de datos SQL Server.</p>
<p>Deberíamos utilizar las siguientes referencias using:</p>
<pre>using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data;</pre>
<p>Los ejemplos son los siguientes:</p>
<pre>/// Ejecución de consulta devolviendo un dataset.
try
{
   string consulta = "SELECT * col1, col2 FROM TABLA_PRUEBA";
   Database db = DatabaseFactory.CreateDatabase();
   System.Data.Common.DbCommand cmd = db.GetSqlStringCommand(consulta);
   DataSet ds = db.ExecuteDataSet(cmd);           

   // Ejemplo de recorrido.
   DataTable DT = ds.Tables[0];
   int j = DT.Rows.Count;
   for (int i = 0; i &lt; j; i++)
   {
         ListaCualquiera.Add(DT.Rows[i]["DS_Tratamiento"].ToString());
   }
 }
 catch (Exception ex)
 {
     bool reThrow = ExceptionPolicy.HandleException(ex, "BaseDatos");
     if (reThrow) throw;
 }

/// Ejecución de consulta obteniendo escalar.
try
{
    string sentencia = "select max(col1) from TABLA_PRUEBA";
    Database db = DatabaseFactory.CreateDatabase();
    System.Data.Common.DbCommand cmd = db.GetSqlStringCommand(sentencia);
    int cd = (int) db.ExecuteScalar(cmd);
}
catch (Exception ex)
{
    bool reThrow = ExceptionPolicy.HandleException(ex, "BaseDatos");
    if (reThrow) throw;
}

/// Ejecución de insert, utiliza parámetros.
try
{
     String valor = "Valor2";
     sentencia = "insert into TABLA_PRUEBA values ('Valor1', @valor)";
     cmd = db.GetSqlStringCommand(sentencia);

     //Asociar tipos y variables al comando
     db.AddInParameter(cmd, "valor", DbType.String, valor);

     //Ejecutamos el comando
     int resultado = db.ExecuteNonQuery(cmd);
}
catch (Exception ex)
{
     bool reThrow = ExceptionPolicy.HandleException(ex, "BaseDatos");
     if (reThrow) throw;
}

/// Ejecución delete.
try
{
    Database db = DatabaseFactory.CreateDatabase();
    String sentencia = "delete from TABLA_PRUEBA where DCol1 = 'valor5'";
    System.Data.Common.DbCommand cmd = db.GetSqlStringCommand(sentencia);

    int resultado = db.ExecuteNonQuery(cmd);
}
catch (Exception ex)
{
    bool reThrow = ExceptionPolicy.HandleException(ex, "BaseDatos");
    if (reThrow) throw;
}</pre>
<p>Para que estos ejemplos funcionen correctamente se debe configurar en el fichero de configuración de la aplicación la cadena de conexión y establecerla como &#8220;por defecto&#8221;.</p>
<p>Además, los ejemplos utilizan el bloque de aplicación de excepciones de Enterprise Library.</p>
]]></content:encoded>
			<wfw:commentRss>http://programacion.porexpertos.es/microsoft-unity-data-access-application-block-ejemplos-basicos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unity Application Block 1.2. Caso Práctico.</title>
		<link>http://programacion.porexpertos.es/unity-application-block-12-caso-practico/</link>
		<comments>http://programacion.porexpertos.es/unity-application-block-12-caso-practico/#comments</comments>
		<pubDate>Wed, 04 Mar 2009 08:42:31 +0000</pubDate>
		<dc:creator>Jorge Ruiz</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Ingeniería del Software]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[DI]]></category>
		<category><![CDATA[inyección código]]></category>
		<category><![CDATA[IoC]]></category>
		<category><![CDATA[orientación a objetos]]></category>
		<category><![CDATA[patrones]]></category>
		<category><![CDATA[unity]]></category>

		<guid isPermaLink="false">http://programacion.porexpertos.es/?p=244</guid>
		<description><![CDATA[Microsoft Unity Application Block 1.2 es un contenedor de inyección de código que soporta inyección por constructor, por propiedad (setter) y por método, ofreciendo a los desarrolladores las siguientes ventajas: Provee una manera simplificada de creación de objetos, especialmente para crear objetos de una jerarquía de clases, simplificando el código de la aplicación. Soporte abstracción [...]]]></description>
			<content:encoded><![CDATA[<p>Microsoft Unity Application Block 1.2 es un contenedor de inyección de código que soporta inyección por constructor, por propiedad (setter) y por método, ofreciendo a los desarrolladores las siguientes ventajas:</p>
<div class="itemizedlist">
<ul type="disc">
<li>Provee una manera simplificada de creación de objetos, especialmente para crear objetos de una jerarquía de clases, simplificando el código de la aplicación.</li>
<li>Soporte abstracción de requerimientos, lo que permite a los desarrolladores especificar dependencias en tiempo de ejecución o mediante un fichero de configuración, simplificando el manejo del código transversal en las aplicaciones.</li>
<li>Incrementa la flexibilidad, dejando la configuración de los componentes al contenedor.</li>
<li>Dispone de capacidades para la localización de servicios. Esto permite a los clientes almacenar o cachear el contenedor. Esto es especialmente interesante en aplicaciones web ASP.NET donde los desarrolladores pueden persistir el contenedor en la memoria de sesión o de aplicación.</li>
</ul>
</div>
<p>Unity Application Block permite a los desarrolladores realizar ingeniería del software basada en componentes. Las aplicaciones modernas están formadas por objetos de negocio particulares y por componentes que realizan tareas genéricas o específicas dentro de la aplicación. Además, están formadas por componentes individuales ejecutados de forma transversal como traceo, autenticación, autorización, cacheo y manejo de excepciones.</p>
<p>Una de las claves para conseguir desarrollar con éxito este tipo de aplicaciones es conseguir un diseño de código desacoplado o lo menos acoplado posible. Con un diseño y desarrollo software desacoplado conseguiremos aplicaciones más flexibles y fáciles de mantener.</p>
<p>Existen diferentes técnicas para permitir el diseño y desarrollo de software desacoplado. En este artículo nos centraremos en los patrones de diseño Inversión del Control (IoC &#8211; Inversion of Control) e Inyección por Dependencia (DI &#8211; Dependency Injection) pero existen otras como el patrón de diseño Intercepción (Interception pattern).</p>
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="PatronesDiseno"></a><span lang="es">Inversion of Control (IoC) &#8211; Dependency Injection (DI)</span></h2>
</div>
</div>
</div>
<p>El patrón Inversion of Control (IoC) es un patrón de diseño genérico que describe técnicas para soportar arquitecturas con la capacidad de intercambio de software (plug-in) donde los objetos pueden buscar instancias de otros objetos que éstos necesitan.</p>
<p>El patrón de diseño Dependency Injection (DI) es un caso especial del patrón IoC y es una técnica de programación basada en <code>interfaces</code> consistente en alterar el comportamiento de la clase sin cambiar internamente ésta. El desarrollador genera código contra un interface para la clase y usa un contenedor que inyecta la instancia de la clase, basándose en el <code>interface</code> o el tipo del objeto. Las técnicas para inyectar instancias son: inyección por <code>interface</code>, inyección por constructor, inyección por propiedad (setter) e inyección por método.</p>
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="CasoPracticoExplicacion"></a><span lang="es">Caso Práctico </span></h2>
</div>
</div>
</div>
<p>Realizar con éxito un proyecto de desarrollo software es una empresa complicada. presupuestos limitados, diferentes tecnologías, resistencia al cambio, necesidades mal definidas y cambiantes, carencia de profesionales cualificados, son algunos de los problemas con los que se encuentra un equipo de ingenieros del software cuando pretenden ofrecer una solución que resuelva o al menos minimice el impacto de estos y otros problemas posibles.</p>
<p>Con asiduidad nos hemos enfrentado ante casos en los que se plantea una funcionalidad transversal utilizada desde diferentes puntos del sistema y que además puede cambiar y ser ampliada con frecuencia.</p>
<p>Ante estos casos no sólo es deseable disponer de un buen diseño orientado a objetos que nos permita poder actuar sobre la funcionalidad cambiante y poder ampliar a nuevos casos sino que también es interesante la actualización &#8220;en caliente&#8221; de estos cambios. Sería deseable que cuando nuestro sistema esté en producción, ante un cambio de funcionalidad o extensión de ésta, no tuviéramos que abrir nuestro compilador con el proyecto entero, codificar los cambios, parar el aplicativo en producción (y las personas que trabajan sobre él), hacer el cambio y volver a levantar el entorno.</p>
<p>Una solución deseable consistiría en implementar el cambio o la nueva funcionalidad en una DLL, implantar esta DLL en producción y configurar la creación de los objetos que disparan esa funcionalidad desde un fichero XML.</p>
<p>El caso que nos ocupa trata de resolver un problema (simplificado) de gestión de alertas en un proyecto software. Podríamos decir que vamos a diseñar una solución orientada a objetos que nos permita definir una alerta con la capacidad de ejecutarse en un día, hora y minuto concreto. En la solución final cada alerta tendrá una implementación concreta. Además, existirá un planificador que será el encargado de ejecutar las alertas en el momento adecuado, por ejemplo, ejecutándose desde un servicio windows.</p>
<p>Para la implementación de este caso práctico simplificado utilizaremos implementación de DLLs, que trata de concentrar en un fichero funcionalidades concretas, Microsoft Unity Application Block 1.2, que nos ofrece un contenedor para la inyección de código mediante constructor (parametrós con arrays), y configuración de inyección mediante fichero XML.</p>
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="Ejemplo"></a><span lang="es">Ejemplo</span></h2>
</div>
</div>
</div>
<p>Toda la funcionalidad la vamos a implementar en una DLL llamada Solusoft.DC. En esta DLL vamos a tener tanto la funcionalidad de las alertas como la del planificador. Realmente no debería ser así y deberían estar en dos DLLs separadas para dividir aún más el código.</p>
<p>A continuación se muestra una implementación de las Alertas utilizando un interfaz y una jerarquía de clases. Nos aprovecharemos del método ejecutar() para lanzar la tarea cuando se cumplan las condiciones de estar en el día, hora, minuto correctos. Nótese que los tipos devueltos por el interfaz son de tipo string por comodidad a la hora de hacer la inyección de código.</p>
<pre>// namespace Solusoft.DC.Alertas.Interfaces
public interface IAlertable
{
       void Ejecutar();
       System.String DiaEjecucion();
       System.String HoraEjecucion();
       System.String MinutoEjecucion();
}

// namespace Solusoft.DC.Alertas
public abstract class Alerta
{
    protected System.String dia;
    protected System.String hora;
    protected System.String minuto;

    public Alerta(System.String dia, System.String hora, System.String minuto)
    {
        this.dia = dia;
        this.hora = hora;
        this.minuto = minuto;
    }
}

public class AlertaX : Alerta , Interfaces.IAlertable
{
    public AlertaX(System.String dia, System.String hora, System.String minuto)
    : base(dia, hora, minuto)
    {
        ;
    }

    public void Ejecutar()
    {
        Console.WriteLine("Se ha ejecutado la alerta X");
    }

    public System.String DiaEjecucion()
    {
        return this.dia;
    }

    public System.String HoraEjecucion()
    {
        return this.hora;
    }

    public System.String MinutoEjecucion()
    {
        return this.minuto;
    }
}

public class AlertaY : Alerta, Interfaces.IAlertable
{

    public AlertaY(System.String dia, System.String hora, System.String minuto)
                           : base(dia, hora, minuto)
    {
        ;
    }

    public void Ejecutar()
    {
        Console.WriteLine("Se ha ejecutado la alerta Y");
    }

    public System.String DiaEjecucion()
    {
        return this.dia;
    }

    public System.String HoraEjecucion()
    {
        return this.hora;
    }

    public System.String MinutoEjecucion()
    {
        return this.minuto;
    }
}</pre>
<p>El planificador es algo más sencillo pero tiene una característica importante y es la de incorporar en el constructor un array de referencias a objetos que implementen el interfaz <code>IAlertable</code>. Esto nos servirá para poder indicarle al contenedor cuáles son las instancias concretas de alertas que se deben planificar.</p>
<pre>// namespace Solusoft.DC.Alertas.Interfaces
public interface IPlanificable
{
        void Ejecutar();
}

// namespace Solusoft.DC.Alertas
public class Planificador : Interfaces.IPlanificable
{
    //Array de alertas
    private Interfaces.IAlertable [] Alertas;

    public Planificador(Interfaces.IAlertable [] alertas)
    {
        this.Alertas = alertas;
    }

    public void Ejecutar()
    {
        Console.WriteLine("Se ha ejecutado el planificador");
        for (int i = 0; i &lt; Alertas.Length; i++)
        {   // Comprobar si ejecutar
            Alertas[i].Ejecutar();
        }
     }

     public void quienSoy()
     {
          Console.WriteLine("Soy el planificador");
     }
}</pre>
<p>Con esta implementación basada en interfaces y herencia estamos en predisposición de tener un software lo más desacoplado posible. Esto unido a la utilización de Microsoft Unity Application Block 1.2 mediante configuración por diseño nos va a permitir indicar incluso en tiempo de ejecución cuáles son las intancias concretas de las alertas que el planificador debe controlar para su ejecución.</p>
<p>A continuación, se muestra el fichero de configuración completo para este ejemplo:</p>
<pre>
<section />

      <!-- Ciclo de vida de los objetos -->

      <!-- Alias para los tipos definidos del usuario -->
      <!-- IPlanificable - Planificador -->

      <!-- Array de IAlertable -->

      <!-- Clase abstracta para alertas -->

<!-- Mapeamos para la interfaz IAlertable - AlertaX-->

<!-- Inyección por constructor -->

<!-- Mapeamos para la interfaz IAlertable - AlertaY-->

<!-- Inyección por constructor -->

<!-- Mapeamos a objeto de clase Planificador -->

<!-- Constructor array injection -->

  <!-- Mapeamos para la clase concreta de Alerta-->

            <!-- Inyección por constructor --> 
</pre>
<p>La configuración de la sección <code>Unity</code> para este ejemplo incorpora los siguientes elementos:</p>
<div class="itemizedlist">
<ul type="disc">
<li>Alias para tipos: Indicando alguno de los posibles ciclos de vida de los objetos propuestos por Microsoft (singleton y external) además de los tipos propios del aplicativo, IPlanificable, IAlertable, IArrayAlertable, Alerta. Estos alias son importantes porque hacen más fáciles de utilizar los tipos completos, nótese que hay que utilizar namespace más nombre de DLL. También se indica el tipo de array que recibirá el constructor del objeto planificador.</li>
<li>Dentro del contenedor definimos el mapeo contra la clase concreta que será utilizada para instanciar un objeto, dándole un nombre, por ejemplo, para el tipo IAlertable se podrán servir una instancia de la clase Solusoft.DC.Alertas.AlertaX si se le pide el objeto al contenedor por el nombre &#8220;AlertaX&#8221; o un objeto de la clase Solusoft.DC.Alertas.AlertaY si se le pide el objeto al contenedor por el nombre &#8220;AlertaY&#8221;. En estos casos se ve como además lleva inyección de código por parámetros de construcción, indicando para cada alerta (X o Y) los valores exactos para dia, hora, minuto.</li>
<li>El caso más interesante es el del planificador que resuelve las peticiones al tipo IPlanificable como una instancia de la clase Solusoft.DC.Alertas.Planificador (fíjese cómo es aquí donde podría cambiar el planificador de nuestro sistema si quisiéramos), permitiendo inyección por constructor con un parámetro que es un array, indicando las instancias concretas de alertas que se le pasaran por el constructor, en este caso mediante los nombres AlertaX, AlertaY.</li>
</ul>
</div>
<p>Una vez que tenemos la estructura de clases/interfaces y el contenedor configurado tan solo nos queda saber utilizarlo desde el código de nuestra aplicación. El ejemplo es el siguiente:</p>
<pre>IUnityContainer container = new UnityContainer();
var section =
           (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
           section.Containers.Default.Configure(container);

// Alerta alerta = container.Resolve&lt;Alerta&gt;();

IAlertable alertaX = container.Resolve&lt;IAlertable&gt;("AlertaX");
Console.WriteLine(alertaX.MinutoEjecucion());

IAlertable alertaY = container.Resolve&lt;IAlertable&gt;("AlertaY");
Console.WriteLine(alertaY.MinutoEjecucion());

string objetoPlanificador = ConfigurationSettings.AppSettings[CFG_PLANIFICADOR] as string;

IPlanificable planificador = container.Resolve&lt;IPlanificable&gt;(objetoPlanificador);

planificador.Ejecutar();

Console.ReadLine();  </pre>
<p>La utilización del contedor una vez configurado es muy sencilla. En primer lugar hay que decirle a nuestro aplicativo que se prepare para utilizar un contenedor y que lo haga cargando la configuración desde la sección <code>Unity</code>. En este ejemplo, el fichero de configuración es el App.Config de una aplicación en modo consola pero podría ser cualquier otro (consultar documentación para cargar la configuración de otro archivo).</p>
<p>Mediante llamadas <code>container.Resolve</code> conseguimos pedir al contenedor los objetos que hayan sido configurados previamente en diseño. Con esto hacemos la llamada a: <code>IPlanificable planificador = container.Resolve_IPlanificable_(objetoPlanificador);</code> para pedirle el objeto concreto que esté capacitado para planificar. Nótese como en este caso ya estará configurado con las alertas precisas a ejecutar y una llamada simple a <code>planificador.Ejecutar();</code> permitirá su ejecución.</p>
<div class="section" lang="es">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="Conclusiones"></a><span lang="es">Conclusiones</span></h2>
</div>
</div>
</div>
<p>En este artículo hemos visto alguna de las características de Microsoft Unity Application Block, concretamente aquellas que nos permiten resolver instancias de objetos del contenedor por medio de configuración en ficheros XML. Sólo con esto nuestras arquitecturas de software pueden ser desacopladas y muy versátiles.</p>
<p>Para más información puede consultar <a title="Microsoft Developer Network" rel="nofollow" href="http://msdn.microsoft.com/" target="_blank">Microsoft Developer Network</a></div>
]]></content:encoded>
			<wfw:commentRss>http://programacion.porexpertos.es/unity-application-block-12-caso-practico/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interbloqueos en SQL Server</title>
		<link>http://programacion.porexpertos.es/interbloqueos-en-sql-server/</link>
		<comments>http://programacion.porexpertos.es/interbloqueos-en-sql-server/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 07:52:51 +0000</pubDate>
		<dc:creator>Sergio Alcalde</dc:creator>
				<category><![CDATA[Documentación]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[bloqueos]]></category>
		<category><![CDATA[concurrencia]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[T-SQL]]></category>
		<category><![CDATA[transacciones]]></category>

		<guid isPermaLink="false">http://programacion.porexpertos.es/?p=225</guid>
		<description><![CDATA[Por si fuera poco lo que hemos visto hasta ahora, aún tenemos pendiente revisar la gestión de interbloqueos que realiza SQL Server. Este punto es de vital importancia en nuestras aplicaciones que acceden concurrentemente a los datos en nuestra base de datos. Un interbloqueo es una situación en la que dos transacciones están esperando para [...]]]></description>
			<content:encoded><![CDATA[<p>Por si fuera poco lo que hemos visto hasta ahora, aún tenemos pendiente revisar la gestión de interbloqueos que realiza SQL Server. Este punto es de vital importancia en nuestras aplicaciones que acceden concurrentemente a los datos en nuestra base de datos.</p>
<p>Un interbloqueo es una situación en la que dos transacciones están esperando  para utilizar un recurso bloqueado.</p>
<p>SQL Server detecta automáticamente una situación de interbloqueo mediante un método denominado detección de cadenas circulares de bloqueos. Cuando un interbloqueo ocurre, SQL Server termina el proceso que haya generado la cadena circular de bloqueos.</p>
<p>Los interbloqueos no se producen únicamente a nivel de página de datos, de hecho, muchos interbloqueos se producen a nivel de página de índice.</p>
<h2>Minimización de la contienda de bloqueo</h2>
<p>Para minimizar el número de interbloqueos se deben considerar las siguientes recomendaciones:</p>
<ul>
<li>Las transacciones deben ser cortas y afectar al menor número de datos posibles.</li>
<li>Se debe dar preferencia a la utilización de alguna de las técnicas del enfoque optimista.</li>
<li>Puede resultar conveniente establecer una prioridad baja (“set deadlockpriority low”) para las consultas DSS y una alta (“set deadlockpriority normal”) para las consultas OLTP.</li>
<li>El orden de acceso a las tablas debe ser siempre el mismo en las distintas partes del código.</li>
<li>Se debe minimizar el uso de “holdlock”. Por ejemplo, el código:</li>
</ul>
<pre>declare @SEQNO int

begin transaction
   select @SEQNO = isnull(SEQ#,0)+1
   from SEQUENCE with holdlock
   /*
      En ausencia de holdlock el bloqueo compartido sería liberado
      por lo que si otra transacción concurrente ejecutara el mismo
      comando obtendría el mismo número de secuencia
   */
   update SEQUENCE
   set SEQ# = @SEQNO
   /*
      Ahora puede hacerse lo que se desee con este número de
      secuencia
   */
   …
commit transaction
podría reescribirse como:
declare @SEQNO int

begin transaction
   update SEQUENCE
   set @SEQNO = isnull(SEQ#,0)+1
   from SEQUENCE
   select @SEQNO
   …
commit transaction</pre>
<p>De esta forma se obtiene directamente el bloqueo de actualización eliminándose la posibilidad de que se produzca un interbloqueo.</p>
<ul>
<li>SQL Server proporciona un soporte completo para establecer la granularidad del bloqueo a nivel de fila. Una granuralidad del bloqueo más fina proporciona una mejor concurrencia, minimizando el número de interbloqueos, aunque aumenta el trabajo del servidor para gestionar los bloqueos.</li>
<li>Se debe evitar las interactuaciones con el usuario dentro de una transacción con el fin de minimizar el tiempo de duración de la misma.</li>
<li>Se debe seleccionar cuidadosamente el nivel de aislamiento de una transacción, ya que el nivel de aislamiento determina el tipo de bloqueo. Es posible reducir el número de interbloqueos bajando el nivel de aislamiento.</li>
</ul>
<h2>Gestión de interbloqueos</h2>
<p>SQL Server devuelve el error 1205 al cliente cuando termina un proceso como resultado de un interbloqueo.</p>
<p>Leer más sobre:</p>
<ol>
<li><a title="Gestión de transacciones en SQL Server" href="http://programacion.porexpertos.es/gestion-de-transacciones-en-sql-server/">Gestión de transacciones en SQL Server</a> (1/7)</li>
<li><a title="Gestión de bloqueos en SQL Server" href="http://programacion.porexpertos.es/gestion-de-bloqueos-en-sql-server/">Gestión de bloqueos en SQL Server</a> (2/7)</li>
<li><a title="Enfoques de control de transacciones en SQL Server" href="http://programacion.porexpertos.es/enfoques-de-control-de-transacciones-en-sql-server/">Enfoques de control de transacciones en SQL Server</a> (3/7)</li>
<li><a title="Enfoque optimista de gestión de transacciones en SQL Server" href="http://programacion.porexpertos.es/enfoque-optimista-de-gestion-de-transacciones-en-sql-server/">Enfoque optimista de gestión de transacciones en SQL Server</a> (4/7)</li>
<li><a title="Enfoque pesimista de gestión de transacciones en SQL Server" href="http://programacion.porexpertos.es/enfoque-pesimista-de-gestion-de-transacciones-en-sql-server/">Enfoque pesimista de gestión de transacciones en SQL Server</a> (5/7)</li>
<li><a title="Enfoque mixto de gestión de transacciones en SQL Server" href="http://programacion.porexpertos.es/enfoque-mixto-de-gestion-de-transacciones-en-sql-server/">Enfoque mixto de gestión de transacciones en SQL Server</a> (6/7)</li>
<li>Interbloqueos en SQL Server (7/7)</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://programacion.porexpertos.es/interbloqueos-en-sql-server/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

