<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Comentarios en: Burlando el patrón Singleton con reflectividad</title>
	<atom:link href="http://www.carballude.es/blog/?feed=rss2&#038;p=510" rel="self" type="application/rss+xml" />
	<link>http://www.carballude.es/blog/?p=510&amp;utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=burlando-el-patron-singleton-con-reflectividad</link>
	<description>Un sitio donde reflexionar y aprender</description>
	<lastBuildDate>Thu, 09 Sep 2010 15:55:17 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	<item>
		<title>Por: Carballude</title>
		<link>http://www.carballude.es/blog/?p=510&#038;cpage=1#comment-6045</link>
		<dc:creator>Carballude</dc:creator>
		<pubDate>Mon, 26 Apr 2010 16:04:52 +0000</pubDate>
		<guid isPermaLink="false">http://www.carballude.es/Blog/?p=510#comment-6045</guid>
		<description>Sí sí, que el sistema es una salvajada lo sé. No está pensado para usarse, es más una curiosidad que otra cosa.

En cuanto pueda le echo un ojo a ReflectionPermission y os cuento si logro evitar ese comportamiento ;)</description>
		<content:encoded><![CDATA[<p>Sí sí, que el sistema es una salvajada lo sé. No está pensado para usarse, es más una curiosidad que otra cosa.</p>
<p>En cuanto pueda le echo un ojo a ReflectionPermission y os cuento si logro evitar ese comportamiento ;)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Redondo</title>
		<link>http://www.carballude.es/blog/?p=510&#038;cpage=1#comment-6044</link>
		<dc:creator>Redondo</dc:creator>
		<pubDate>Mon, 26 Apr 2010 15:54:09 +0000</pubDate>
		<guid isPermaLink="false">http://www.carballude.es/Blog/?p=510#comment-6044</guid>
		<description>Por cierto, como respuesta a tu última pregunta yo te recomiendo que explores la clase ReflectionPermissión. No se si se aplica a lo que quieres hacer, pero aunque a mi no me ha hecho falta usarla nunca por ahora, parece que si que puede hacer lo que tu buscas.

http://msdn.microsoft.com/en-us/library/system.security.permissions.reflectionpermission.aspx
http://msdn.microsoft.com/en-us/library/stfy7tfc.aspx</description>
		<content:encoded><![CDATA[<p>Por cierto, como respuesta a tu última pregunta yo te recomiendo que explores la clase ReflectionPermissión. No se si se aplica a lo que quieres hacer, pero aunque a mi no me ha hecho falta usarla nunca por ahora, parece que si que puede hacer lo que tu buscas.</p>
<p><a href="http://msdn.microsoft.com/en-us/library/system.security.permissions.reflectionpermission.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/system.security.permissions.reflectionpermission.aspx</a><br />
<a href="http://msdn.microsoft.com/en-us/library/stfy7tfc.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/stfy7tfc.aspx</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Redondo</title>
		<link>http://www.carballude.es/blog/?p=510&#038;cpage=1#comment-6043</link>
		<dc:creator>Redondo</dc:creator>
		<pubDate>Mon, 26 Apr 2010 15:52:47 +0000</pubDate>
		<guid isPermaLink="false">http://www.carballude.es/Blog/?p=510#comment-6043</guid>
		<description>El problema es que tu codigo reflectivo viola la encapsulación. Si un constructor es privado no deberías intentar acceder a el e invocarlo para crear una nueva instancia, más aún cuando tienes un método GetInstance que sirve precisamente para eso y al que deberías intentar llamar para crear nuevas instancias (puesto que es el contrato original que tiene tu clase). 

Por otra parte, lo que dice Guti es correcto, y ya
que el hecho de que en el constructor el que no exista una instancia previa es una precondición a cumplir por ser un Singleton, deberías lanzar una excepción en el caso de que dicha precondición no se cumpla. 

El hecho de que la reflectividad pueda permitirte explorar partes privadas de una clase no significa que debas abusar de ello :)

Saludos,

Yo</description>
		<content:encoded><![CDATA[<p>El problema es que tu codigo reflectivo viola la encapsulación. Si un constructor es privado no deberías intentar acceder a el e invocarlo para crear una nueva instancia, más aún cuando tienes un método GetInstance que sirve precisamente para eso y al que deberías intentar llamar para crear nuevas instancias (puesto que es el contrato original que tiene tu clase). </p>
<p>Por otra parte, lo que dice Guti es correcto, y ya<br />
que el hecho de que en el constructor el que no exista una instancia previa es una precondición a cumplir por ser un Singleton, deberías lanzar una excepción en el caso de que dicha precondición no se cumpla. </p>
<p>El hecho de que la reflectividad pueda permitirte explorar partes privadas de una clase no significa que debas abusar de ello :)</p>
<p>Saludos,</p>
<p>Yo</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Mafias</title>
		<link>http://www.carballude.es/blog/?p=510&#038;cpage=1#comment-6000</link>
		<dc:creator>Mafias</dc:creator>
		<pubDate>Thu, 18 Mar 2010 12:56:31 +0000</pubDate>
		<guid isPermaLink="false">http://www.carballude.es/Blog/?p=510#comment-6000</guid>
		<description>Buena pregunta. Carba, trabaja e infórmanos, que algunos tenemos que levantar el país :-p</description>
		<content:encoded><![CDATA[<p>Buena pregunta. Carba, trabaja e infórmanos, que algunos tenemos que levantar el país :-p</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Guti</title>
		<link>http://www.carballude.es/blog/?p=510&#038;cpage=1#comment-5998</link>
		<dc:creator>Guti</dc:creator>
		<pubDate>Wed, 17 Mar 2010 10:12:38 +0000</pubDate>
		<guid isPermaLink="false">http://www.carballude.es/Blog/?p=510#comment-5998</guid>
		<description>El problema que veo yo es que aunque elimines el constructor igual se invoca uno por defecto. Esa es la duda que tengo, si se puede realmente conseguir que typeof(Singleton).GetConstructor() diga que nones.</description>
		<content:encoded><![CDATA[<p>El problema que veo yo es que aunque elimines el constructor igual se invoca uno por defecto. Esa es la duda que tengo, si se puede realmente conseguir que typeof(Singleton).GetConstructor() diga que nones.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Mafias</title>
		<link>http://www.carballude.es/blog/?p=510&#038;cpage=1#comment-5997</link>
		<dc:creator>Mafias</dc:creator>
		<pubDate>Wed, 17 Mar 2010 09:42:38 +0000</pubDate>
		<guid isPermaLink="false">http://www.carballude.es/Blog/?p=510#comment-5997</guid>
		<description>Puedes mandarle este post a Redondo, que seguro que te ilustra. O a Ortín, y pillar papel y lápiz para la clase magistral xD

Lo primero, ¿para qué querrías saltarte un singleton? Si está así, será por algo, no? :-)
Sobre la implementación, obviamente, no hay ninguna &quot;resistente&quot;, salvo lo que comenta Guti: lanzar una excepción de seguridad en el constructor si la instancia no es null.

Respecto a ponernos bestias, desde el propio constructor no lo sé, pero sí que podrías &quot;borrar&quot; el método constructor de la clase mediante reflexión en el getInstance (al menos creo que puedes hacerlo en la última versión de C#), de manera que no se puede llamar al método porque... no existe. Pero al margen de toda la diversión por enredar con el lenguaje, no le veo utilidad al tema :-)</description>
		<content:encoded><![CDATA[<p>Puedes mandarle este post a Redondo, que seguro que te ilustra. O a Ortín, y pillar papel y lápiz para la clase magistral xD</p>
<p>Lo primero, ¿para qué querrías saltarte un singleton? Si está así, será por algo, no? :-)<br />
Sobre la implementación, obviamente, no hay ninguna &#8220;resistente&#8221;, salvo lo que comenta Guti: lanzar una excepción de seguridad en el constructor si la instancia no es null.</p>
<p>Respecto a ponernos bestias, desde el propio constructor no lo sé, pero sí que podrías &#8220;borrar&#8221; el método constructor de la clase mediante reflexión en el getInstance (al menos creo que puedes hacerlo en la última versión de C#), de manera que no se puede llamar al método porque&#8230; no existe. Pero al margen de toda la diversión por enredar con el lenguaje, no le veo utilidad al tema :-)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Guti</title>
		<link>http://www.carballude.es/blog/?p=510&#038;cpage=1#comment-5996</link>
		<dc:creator>Guti</dc:creator>
		<pubDate>Wed, 17 Mar 2010 08:33:42 +0000</pubDate>
		<guid isPermaLink="false">http://www.carballude.es/Blog/?p=510#comment-5996</guid>
		<description>Yo no haría ID++; sólo jugaría con los valores 0 ó 1. Aunque es verdad que eso no impediría crear una segunda instancia, con lo que los datos no static se podrían repetir y el singleton no valdría para mucho. (Y además no se podría hacer el experimento que has hecho y saber qué pasó :-) )

La única solución que veo es en tiempo de ejecución, pero supongo que no es lo que quieres. Si se invoca al constructor después de la primera vez... excepción que te crió :-)

Yo no he usado reflectividad apenas, pero ya que estamos poniéndonos en plan bestia, y pensando en usar las mismas armas, ¿es posible, usando reflectividad en el propio constructor del singleton, descuajaringar el constructor después de la primera creación, de modo que ya nunca se pueda invocar? Ya me supongo que no...</description>
		<content:encoded><![CDATA[<p>Yo no haría ID++; sólo jugaría con los valores 0 ó 1. Aunque es verdad que eso no impediría crear una segunda instancia, con lo que los datos no static se podrían repetir y el singleton no valdría para mucho. (Y además no se podría hacer el experimento que has hecho y saber qué pasó :-) )</p>
<p>La única solución que veo es en tiempo de ejecución, pero supongo que no es lo que quieres. Si se invoca al constructor después de la primera vez&#8230; excepción que te crió :-)</p>
<p>Yo no he usado reflectividad apenas, pero ya que estamos poniéndonos en plan bestia, y pensando en usar las mismas armas, ¿es posible, usando reflectividad en el propio constructor del singleton, descuajaringar el constructor después de la primera creación, de modo que ya nunca se pueda invocar? Ya me supongo que no&#8230;</p>
]]></content:encoded>
	</item>
</channel>
</rss>
