<feed xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US">
    <title>DevelopMENTAL Madness</title>
    <link rel="self" type="application/atom+xml" href="http://www.developmentalmadness.com/Atom.aspx" />
    <subtitle type="html">The musings, frustrations and epiphanies of a common web programmer.</subtitle>
    <id>http://www.developmentalmadness.com/Default.aspx</id>
    <author>
        <name>Mark J. Miller</name>
        <uri>http://www.developmentalmadness.com/Default.aspx</uri>
    </author>
    <generator uri="http://subtextproject.com" version="Subtext Version 2.1.2.2">Subtext</generator>
    <updated>2010-04-29T13:00:01Z</updated>
    <entry>
        <title>SQL Server add column with DEFAULT CONSTRAINT: The Dumb Little Things</title>
        <link rel="alternate" type="text/html" href="http://www.developmentalmadness.com/archive/2010/04/29/sql-server-add-column-with-default-constraint-the-dumb-little.aspx" />
        <id>http://www.developmentalmadness.com/archive/2010/04/29/sql-server-add-column-with-default-constraint-the-dumb-little.aspx</id>
        <published>2010-04-29T12:39:36Z</published>
        <updated>2010-04-29T13:00:01Z</updated>
        <content type="html">&lt;p&gt;Sometimes you think you know and then when you go and open your big mouth and make a fool of yourself. &lt;a href="http://www.developmentalmadness.com/images/dumb-and-dumber-400.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="dumb-and-dumber-400" border="0" alt="dumb-and-dumber-400" align="right" src="http://www.developmentalmadness.com/images/dumb-and-dumber-400.jpg" width="400" height="300" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I generally script all my database changes by hand. Not 100%, if it’s a big change I’ll right-click the object and use the script menu command to generate a script I can paste into my script editor. But often if I’m creating new objects I’ll write the script by hand from scratch. &lt;/p&gt;  &lt;p&gt;Last week I needed to add a column to three separate tables and the column was not nullable. So as I have done so many times in the past, I proceeded to drop all dependent objects, create a temp table with the new table structure, copy the data, drop the old table, rename the temp table and proceed to recreate all dependent objects (triggers, constraints, indexes). The script for each table was pretty long.&lt;/p&gt;  &lt;p&gt;But yesterday the deployment script I wrote wouldn’t run in the QA environment. And someone asked why I didn’t just use the ALTER TABLE [tablename] ADD [column] syntax and do it all in one line. &lt;/p&gt;  &lt;p&gt;My response was the column wasn’t nullable. The answer was, “use a default constraint”. To which I responded that default constraints don’t add the default data to existing rows, only on new inserts. Hence I couldn’t use that technique. &lt;/p&gt;  &lt;p&gt;I was so sure, I went back to my desk to write a script to prove I was right. I wrote the following script:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; ColumnTest (&lt;/pre&gt;

  &lt;pre&gt;    Id &lt;span class="kwrd"&gt;INT&lt;/span&gt; &lt;span class="kwrd"&gt;IDENTITY&lt;/span&gt;(1,1),&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Name &lt;span class="kwrd"&gt;VARCHAR&lt;/span&gt;(10)&lt;/pre&gt;

  &lt;pre&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;INSERT &lt;span class="kwrd"&gt;INTO&lt;/span&gt; ColumnTest(Name) &lt;span class="kwrd"&gt;VALUES&lt;/span&gt; (&lt;span class="str"&gt;'Mark'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;INSERT &lt;span class="kwrd"&gt;INTO&lt;/span&gt; ColumnTest(Name) &lt;span class="kwrd"&gt;VALUES&lt;/span&gt; (&lt;span class="str"&gt;'eSteve'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre&gt;INSERT &lt;span class="kwrd"&gt;INTO&lt;/span&gt; ColumnTest(Name) &lt;span class="kwrd"&gt;VALUES&lt;/span&gt; (&lt;span class="str"&gt;'Tyler'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;INSERT &lt;span class="kwrd"&gt;INTO&lt;/span&gt; ColumnTest(Name) &lt;span class="kwrd"&gt;VALUES&lt;/span&gt; (&lt;span class="str"&gt;'Jason'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre&gt;INSERT &lt;span class="kwrd"&gt;INTO&lt;/span&gt; ColumnTest(Name) &lt;span class="kwrd"&gt;VALUES&lt;/span&gt; (&lt;span class="str"&gt;'Chad'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;INSERT &lt;span class="kwrd"&gt;INTO&lt;/span&gt; ColumnTest(Name) &lt;span class="kwrd"&gt;VALUES&lt;/span&gt; (&lt;span class="str"&gt;'Mike'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre&gt;INSERT &lt;span class="kwrd"&gt;INTO&lt;/span&gt; ColumnTest(Name) &lt;span class="kwrd"&gt;VALUES&lt;/span&gt; (&lt;span class="str"&gt;'Nick'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; ColumnTest &lt;span class="kwrd"&gt;ADD&lt;/span&gt; AreaCode &lt;span class="kwrd"&gt;CHAR&lt;/span&gt;(3) &lt;span class="kwrd"&gt;DEFAULT&lt;/span&gt;(&lt;span class="str"&gt;'801'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; * &lt;span class="kwrd"&gt;FROM&lt;/span&gt; ColumnTest&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;DROP&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; ColumnTest&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p /&gt;

&lt;p&gt;The result of the SELECT proved that the column “AreaCode” was null. But then I noticed I hadn’t set the column to “NOT NULL”. So I modified the script like this:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; ColumnTest (&lt;/pre&gt;

  &lt;pre&gt;    Id &lt;span class="kwrd"&gt;INT&lt;/span&gt; &lt;span class="kwrd"&gt;IDENTITY&lt;/span&gt;(1,1),&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Name &lt;span class="kwrd"&gt;VARCHAR&lt;/span&gt;(10)&lt;/pre&gt;

  &lt;pre&gt;    &lt;/pre&gt;

  &lt;pre class="alt"&gt;)&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;INSERT &lt;span class="kwrd"&gt;INTO&lt;/span&gt; ColumnTest(Name) &lt;span class="kwrd"&gt;VALUES&lt;/span&gt; (&lt;span class="str"&gt;'Mark'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre&gt;INSERT &lt;span class="kwrd"&gt;INTO&lt;/span&gt; ColumnTest(Name) &lt;span class="kwrd"&gt;VALUES&lt;/span&gt; (&lt;span class="str"&gt;'eSteve'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;INSERT &lt;span class="kwrd"&gt;INTO&lt;/span&gt; ColumnTest(Name) &lt;span class="kwrd"&gt;VALUES&lt;/span&gt; (&lt;span class="str"&gt;'Tyler'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre&gt;INSERT &lt;span class="kwrd"&gt;INTO&lt;/span&gt; ColumnTest(Name) &lt;span class="kwrd"&gt;VALUES&lt;/span&gt; (&lt;span class="str"&gt;'Jason'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;INSERT &lt;span class="kwrd"&gt;INTO&lt;/span&gt; ColumnTest(Name) &lt;span class="kwrd"&gt;VALUES&lt;/span&gt; (&lt;span class="str"&gt;'Chad'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre&gt;INSERT &lt;span class="kwrd"&gt;INTO&lt;/span&gt; ColumnTest(Name) &lt;span class="kwrd"&gt;VALUES&lt;/span&gt; (&lt;span class="str"&gt;'Mike'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;INSERT &lt;span class="kwrd"&gt;INTO&lt;/span&gt; ColumnTest(Name) &lt;span class="kwrd"&gt;VALUES&lt;/span&gt; (&lt;span class="str"&gt;'Nick'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; ColumnTest &lt;span class="kwrd"&gt;ADD&lt;/span&gt; [&lt;span class="kwrd"&gt;State&lt;/span&gt;] &lt;span class="kwrd"&gt;CHAR&lt;/span&gt;(2) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt; &lt;span class="kwrd"&gt;DEFAULT&lt;/span&gt;(&lt;span class="str"&gt;'UT'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; ColumnTest &lt;span class="kwrd"&gt;ADD&lt;/span&gt; AreaCode &lt;span class="kwrd"&gt;CHAR&lt;/span&gt;(3) &lt;span class="kwrd"&gt;DEFAULT&lt;/span&gt;(&lt;span class="str"&gt;'801'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; * &lt;span class="kwrd"&gt;FROM&lt;/span&gt; ColumnTest&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;DROP&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; ColumnTest&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p /&gt;

&lt;p&gt;Boy was I surprised! I can’t believe I never knew this. Could you imagine the time I could have saved. I hate adding not nullable columns! &lt;/p&gt;

&lt;p&gt;My theory is that this was not always the case and that somewhere along the line (2005, 2008) this was added because of the pain involved in adding columns which could not be null.&lt;/p&gt;

&lt;p&gt;Anyway, it was a humbling experience and not one I’ll forget.&lt;/p&gt;

&lt;p&gt;tags: &lt;a href="http://www.developmentalmadness.com/tags/SQL%20Server/default.aspx" rel="tag"&gt;SQL Server&lt;/a&gt;, &lt;a href="http://www.developmentalmadness.com/tags/T-SQL/default.aspx" rel="tag"&gt;T-SQL&lt;/a&gt;, &lt;a href="http://www.developmentalmadness.com/tags/DDL/default.aspx"&gt;DDL&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.developmentalmadness.com/aggbug/111.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://www.developmentalmadness.com/comments/111.aspx</wfw:comment>
        <slash:comments>5</slash:comments>
        <wfw:commentRss>http://www.developmentalmadness.com/comments/commentRss/111.aspx</wfw:commentRss>
        <trackback:ping>http://www.developmentalmadness.com/services/trackbacks/111.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Domain-Driven Design: Protect your persistence required methods</title>
        <link rel="alternate" type="text/html" href="http://www.developmentalmadness.com/archive/2010/04/16/domain-driven-design-protect-your-persistence-required-methods.aspx" />
        <id>http://www.developmentalmadness.com/archive/2010/04/16/domain-driven-design-protect-your-persistence-required-methods.aspx</id>
        <published>2010-04-16T12:55:49Z</published>
        <updated>2010-04-16T12:55:49Z</updated>
        <content type="html">&lt;p&gt;I’ve been reading up on Domain-Driven Design (DDD) lately and I’ve checked out Jimmy Nilsson’s book &lt;a href="http://my.safaribooksonline.com/0321268202" target="_blank"&gt;Applying Domain-Driven Design and Patterns: With Examples in C# and .NET&lt;/a&gt;. I was reading Ch 5, “Moving Further with Domain-Driven Design” and Jimmy is talking about reconstituting your entity from persistence. &lt;/p&gt;  &lt;p&gt;Specifically, he’s talking about the situation where your entity has read-only fields that must be provided by your persistence layer, but that you don’t want to make public. For example, the entity’s ID field. This is definitely a read-only field, but you have to set it at some point when querying the data from your data store. &lt;/p&gt;  &lt;p&gt;In recent projects I have provided a separate constructor and documented it (read: comments) as “reserved for persistence only”. Also, in some cases, instead of providing a set property method for the ID I have created a method which allows the Id to be set. Something like SetIdFromPersistence() to make it clear that Id is intended as a read-only field. &lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Customer {&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="rem"&gt;/// This is reserved for use by the repository&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="rem"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Customer(&lt;span class="kwrd"&gt;int&lt;/span&gt; id, &lt;span class="kwrd"&gt;string&lt;/span&gt; name){&lt;/pre&gt;

  &lt;pre&gt;    &lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;    &lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="rem"&gt;/// This is open for public use to create a new customer&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="rem"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Customer(&lt;span class="kwrd"&gt;string&lt;/span&gt; name){&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Id { get; &lt;span class="kwrd"&gt;private&lt;/span&gt; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="rem"&gt;/// This is reserved for use by the repository,&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="rem"&gt;/// Id is read-only and using this inappropriately &lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="rem"&gt;/// could result in data corruption issues.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="rem"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SetIdFromRepository(&lt;span class="kwrd"&gt;int&lt;/span&gt; id){&lt;/pre&gt;

  &lt;pre&gt;        Id = id;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;This is because, my persistence layer and my model are in separate assemblies. I’ve considered using reflection to allow me to make the setters and ctors I’ve provided private. But I’ve never really liked this. So I’ve just tried to make it clear what the use cases are for these methods.&lt;/p&gt;

&lt;p&gt;But then something Jimmy said triggered and idea for me and I want to see what everyone else thinks.&lt;/p&gt;

&lt;h2&gt;Explicit Interface Implementation&lt;/h2&gt;

&lt;p&gt;I haven’t run into many developers who’ve heard of this, but you may have noticed this when using some of Visual Studio 2008’s code editing tools (I don’t know if this exists in previous versions of VS, I only discovered it in v. 2008). But if you’re editing a class which implements an interface and you select the interface with your cursor you’ll see that below the interface is an “auto correct” icon/sprite. If you click it or hit ALT+SHIFT+F10 you’ll get a couple options:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Implement interface ‘ISomeInterface’&lt;/li&gt;

  &lt;li&gt;Explicitly implement interface ‘ISomeInterface’&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you select the first option, you’ll get public method/property stubs created in your class for you with the correct method signatures. If you click the second option you’ll see something similar, but you may have to look closer to see the difference (go ahead, I’ll wait)… Ok, you back? Did you notice the difference? Here’s what you should have seen. Given the following interface:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IMyInterface {&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; MyMethod(&lt;span class="kwrd"&gt;int&lt;/span&gt; id);&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; MyProperty { get; set; }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;The first option would generate the following implementation:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; MyClass : IMyInterface {&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; MyMethod(&lt;span class="kwrd"&gt;int&lt;/span&gt; id){&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; MyProperty{&lt;/pre&gt;

  &lt;pre class="alt"&gt;        get{ &lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;        set{&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;And the second option (explicit) would generate this implementation:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; MyClass : IMyInterface {&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; IMyInterface.MyMethod(&lt;span class="kwrd"&gt;int&lt;/span&gt; id){&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; IMyInterface.MyProperty{&lt;/pre&gt;

  &lt;pre class="alt"&gt;        get{ &lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;        set{&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Notice the differences in the second implementation? Let me help:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Not public members&lt;/li&gt;

  &lt;li&gt;each member name is prefixed with IMyInterface&lt;/li&gt;&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;
&lt;/ul&gt;

&lt;p&gt;These members are only visible when the class is explicitly used/cast as IMyInterface. Here’s two examples:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SomeMethod(IMyInterface obj){&lt;/pre&gt;

  &lt;pre&gt;    obj.MyMethod(2);&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SomeMethod2(MyClass obj){&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; x = ((IMyInterface)obj).MyProperty;&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;So the explicit members will never show up in the public interface. I first ran into this years ago, when I was working with a FCL class which I knew implemented a specific interface, but when I tried calling a member of the interface I couldn’t compile the application. An example of this is IConvertable on the Int32 type:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 33;&lt;/pre&gt;

  &lt;pre&gt;i.ToInt32();                    &lt;span class="rem"&gt;//compile error&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;((IConvertable)i).ToInt32();    //compiles&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;&lt;strong&gt;CREDIT&lt;/strong&gt;: I couldn’t remember any FCL examples of this, so I had to search and found the above example on &lt;a href="http://blogs.msdn.com/brada/archive/2003/11/15/50721.aspx" target="_blank"&gt;Brad Abram’s blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The guidlines for this can also be found on the same post by Brad:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Do use explicit members to hide implementation details&lt;/li&gt;

  &lt;li&gt;Do use explicit members to approximate private interface implementations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For reference, here are some links on Explicit Interface Implementation:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms173157(VS.80).aspx" target="_blank"&gt;Explicit Interface Implementation (C# Programming Guide)&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx" target="_blank"&gt;Explicit Interface Implementation Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p /&gt;

&lt;p /&gt;

&lt;p /&gt;

&lt;p /&gt;

&lt;p /&gt;

&lt;p /&gt;

&lt;h2&gt;Exposing Private Members&lt;/h2&gt;

&lt;p&gt;Now back to our discussion on preventing the methods needed by our persistence layer from being called by consumers of our entities. &lt;/p&gt;

&lt;p&gt;Explicit interfaces can be used to hide members that aren’t intended to be called directly by consumers of the object, eg. “Not intended for public use”. &lt;/p&gt;

&lt;p&gt;Can you use this method to prevent consumers from calling your methods at all? No. The interface will be public so you can use it from your persistence layer and it will need to follow your entities around. Most likely it will be a public interface located in the same assembly as your model. However, marking the members as private doesn’t keep consumers from calling them using reflection. This is the solution Jimmy uses to access the private members in his example. He might use something different later on, I get the impression he might use another technique once I read further into the book. &lt;/p&gt;

&lt;p&gt;But this technique will be more efficient and more clean than using reflection. Also, if you are running in a medium-trust environment where calling private members is blocked this technique will still work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CAVEAT&lt;/strong&gt;: When I read Brad Abram’s post I noticed a comment below indicating that if you use this technique with a struct instead of a class you will encounter boxing/unboxing issues. This is an important consideration to keep in mind. Does boxing cost more than using reflection? I don’t know, I’ll leave that exercise to the user.&lt;/p&gt;

&lt;p&gt;tags: &lt;a href="http://www.developmentalmadness.com/tags/DDD/default.aspx" rel="tag"&gt;DDD&lt;/a&gt;, &lt;a href="http://www.developmentalmadness.com/tags/Domain-Driven%20Design/default.aspx" rel="tag"&gt;Domain-Driven Design&lt;/a&gt;, &lt;a href="http://www.developmentalmadness.com/tags/Explicit%20Interface%20Implementation/default.aspx" rel="tag"&gt;Explicit Interface Implementation&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.developmentalmadness.com/aggbug/110.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://www.developmentalmadness.com/comments/110.aspx</wfw:comment>
        <slash:comments>3</slash:comments>
        <wfw:commentRss>http://www.developmentalmadness.com/comments/commentRss/110.aspx</wfw:commentRss>
        <trackback:ping>http://www.developmentalmadness.com/services/trackbacks/110.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Utah Code Camp: Spring 2010</title>
        <link rel="alternate" type="text/html" href="http://www.developmentalmadness.com/archive/2010/03/22/utah-code-camp-spring-2010.aspx" />
        <id>http://www.developmentalmadness.com/archive/2010/03/22/utah-code-camp-spring-2010.aspx</id>
        <published>2010-03-22T15:49:53Z</published>
        <updated>2010-03-22T15:49:53Z</updated>
        <content type="html">&lt;p&gt;Just got confirmation today, I’ll be speaking at the upcoming &lt;a href="http://www.utahcodecamp.com/"&gt;Utah Code Camp&lt;/a&gt;. The topic is ASP.NET MVC: A First Look. I’m hoping to introduce MVC to the uninitiated. If you’re curious or even if you’re a skeptic, come and join me and I’ll walk you through many of the features of MVC that make it such a great framework (including some of the newer versions in the recently released MVC 2).&lt;/p&gt;&lt;img src="http://www.developmentalmadness.com/aggbug/109.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://www.developmentalmadness.com/comments/109.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://www.developmentalmadness.com/comments/commentRss/109.aspx</wfw:commentRss>
        <trackback:ping>http://www.developmentalmadness.com/services/trackbacks/109.aspx</trackback:ping>
    </entry>
</feed>