<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://community.devexpress.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Gary&amp;#39;s Blog</title><subtitle type="html" /><id>http://community.devexpress.com/blogs/garyshort/atom.aspx</id><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/garyshort/default.aspx" /><link rel="self" type="application/atom+xml" href="http://community.devexpress.com/blogs/garyshort/atom.aspx" /><generator uri="http://communityserver.org" version="3.1.30415.43">Community Server</generator><updated>2008-09-11T14:38:03Z</updated><entry><title>XAF RWA Refactor #1</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/garyshort/archive/2008/10/14/xaf-rwa-refactor-1.aspx" /><id>http://community.devexpress.com/blogs/garyshort/archive/2008/10/14/xaf-rwa-refactor-1.aspx</id><published>2008-10-14T16:17:07Z</published><updated>2008-10-14T16:17:07Z</updated><content type="html">&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/garyshort/archive/2008/10/10/xaf-rwa-code-1.aspx"&gt;In my last post&lt;/a&gt; we created the code to satisfy the first use case and JIT design document. Now that our users have had the application for a while, they have sent us a number of issues that need to be addressed, they are:-&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;The fields in the GUI need to be re-ordered to be more “sensible”. &lt;/li&gt;    &lt;li&gt;A Course name must be mandatory and unique. &lt;/li&gt;    &lt;li&gt;A CourseDiary name must be mandatory and unique. &lt;/li&gt;    &lt;li&gt;Start and End dates are mandatory on CourseDiary and Outage. &lt;/li&gt;    &lt;li&gt;The date range on an Outage must be with the range of the CourseDiary dates. &lt;/li&gt;    &lt;li&gt;Where an object has a start date and an end date; end date must be greater than start date. &lt;/li&gt;    &lt;li&gt;An Outage is related to a specific CourseDiary and should not be displayed in the navigation bar. &lt;/li&gt;    &lt;li&gt;The error message for the CourseDiary reference rule is the default one and has not be inverted like the rule itself. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Okay, let’s take these issues in order. To fix the ordering of the fields in the GUI, open the model editor, expand the “views” node, expand the “Course_DetailView node”, select the “layout” node and in the property pane right click and select “Customize Layout”. Now, drag the elements into the order you feel happy with. Repeat these steps for the CourseDiary and Outage detail views.&lt;/p&gt;  &lt;p&gt;Next, let’s deal with making the Course and CourseDiary name mandatory and unique. This is done with the use of two rule attributes, RuleRequiredFieldAttribute and RuleUniqueValueAttribute. So let’s go ahead and add these attributes to the Course and CourseDiary classes:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;private string &lt;/span&gt;_Name;
[&lt;span style="color:#2b91af;"&gt;RuleRequiredField&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Course name required&amp;quot;&lt;/span&gt;,&lt;span style="color:#2b91af;"&gt;DefaultContexts&lt;/span&gt;.Save,&lt;span style="color:#a31515;"&gt;&amp;quot;A name is required!&amp;quot;&lt;/span&gt;)]
[&lt;span style="color:#2b91af;"&gt;RuleUniqueValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Course name must be unique&amp;quot;&lt;/span&gt;,&lt;span style="color:#2b91af;"&gt;DefaultContexts&lt;/span&gt;.Save,&lt;span style="color:#a31515;"&gt;&amp;quot;Course name already exists!&amp;quot;&lt;/span&gt;)]
&lt;span style="color:blue;"&gt;public string &lt;/span&gt;Name {
    &lt;span style="color:blue;"&gt;get &lt;/span&gt;{
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;_Name;
    }
    &lt;span style="color:blue;"&gt;set &lt;/span&gt;{
        SetPropertyValue(&lt;span style="color:#a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;ref &lt;/span&gt;_Name, &lt;span style="color:blue;"&gt;value&lt;/span&gt;);
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Having done that, let’s add tests for these rules:&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;TestCourseMustHaveName() {
    &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;UnitOfWork &lt;/span&gt;uow = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;UnitOfWork&lt;/span&gt;()) {
        &lt;span style="color:#2b91af;"&gt;Course &lt;/span&gt;course = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Course&lt;/span&gt;(uow);
        &lt;span style="color:#2b91af;"&gt;CourseDiary &lt;/span&gt;diary = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CourseDiary&lt;/span&gt;(uow);
        course.Diary = diary;
        &lt;span style="color:#2b91af;"&gt;RuleSet &lt;/span&gt;ruleSet = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RuleSet&lt;/span&gt;();
        &lt;span style="color:#2b91af;"&gt;RuleSetValidationResult &lt;/span&gt;rsvr = 
            ruleSet.ValidateTarget(course, &lt;span style="color:#2b91af;"&gt;DefaultContexts&lt;/span&gt;.Save);
        &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:blue;"&gt;false&lt;/span&gt;, rsvr.IsValid);
    }
}

[&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;TestCourseNameMustBeUnique() {
    &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;UnitOfWork &lt;/span&gt;uow = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;UnitOfWork&lt;/span&gt;()) {
        &lt;span style="color:#2b91af;"&gt;Course &lt;/span&gt;course = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Course&lt;/span&gt;(uow) { Name = &lt;span style="color:#a31515;"&gt;&amp;quot;Test&amp;quot; &lt;/span&gt;};
        &lt;span style="color:#2b91af;"&gt;CourseDiary &lt;/span&gt;diary = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CourseDiary&lt;/span&gt;(uow);
        course.Diary = diary;
        uow.CommitChanges();
    }

    &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;UnitOfWork &lt;/span&gt;uow = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;UnitOfWork&lt;/span&gt;())
    {
        &lt;span style="color:#2b91af;"&gt;Course &lt;/span&gt;course = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Course&lt;/span&gt;(uow) { Name = &lt;span style="color:#a31515;"&gt;&amp;quot;Test&amp;quot; &lt;/span&gt;};
        &lt;span style="color:#2b91af;"&gt;CourseDiary &lt;/span&gt;diary = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CourseDiary&lt;/span&gt;(uow);
        course.Diary = diary;
        &lt;span style="color:#2b91af;"&gt;RuleSet &lt;/span&gt;ruleSet = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RuleSet&lt;/span&gt;();
        &lt;span style="color:#2b91af;"&gt;RuleSetValidationResult &lt;/span&gt;rsvr = 
            ruleSet.ValidateTarget(course, &lt;span style="color:#2b91af;"&gt;DefaultContexts&lt;/span&gt;.Save);
        &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:blue;"&gt;false&lt;/span&gt;, rsvr.IsValid);
    }
}&lt;/pre&gt;

&lt;p&gt;Add similar tests for CourseDiary, then add the attributes and tests to ensure the start and end dates are mandatory on the Outage and the CourseDiary. Having done that, we can now add tests to ensure that the start date is greater than the end date. To do this decorate the class with the RuleCriteria attribute, like so:&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;RuleCriteria&lt;/span&gt;(
        &lt;span style="color:#a31515;"&gt;&amp;quot;Outage end date must be greater than start date&amp;quot;&lt;/span&gt;,
        &lt;span style="color:#2b91af;"&gt;DefaultContexts&lt;/span&gt;.Save,
        &lt;span style="color:#a31515;"&gt;&amp;quot;EndDate &amp;gt; StartDate&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;And create a test to go with it:&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;TestOutageEndDateMustBeGreaterThanStartDate() {
    &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;UnitOfWork &lt;/span&gt;uow = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;UnitOfWork&lt;/span&gt;()) {
        &lt;span style="color:#2b91af;"&gt;DateTime &lt;/span&gt;now = &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;.Now;
        &lt;span style="color:#2b91af;"&gt;Outage &lt;/span&gt;outage = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Outage&lt;/span&gt;(uow) { StartDate = now, EndDate = now };
        &lt;span style="color:#2b91af;"&gt;RuleSet &lt;/span&gt;ruleSet = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RuleSet&lt;/span&gt;();
        &lt;span style="color:#2b91af;"&gt;RuleSetValidationResult &lt;/span&gt;rsvr =
            ruleSet.ValidateTarget(outage, &lt;span style="color:#2b91af;"&gt;DefaultContexts&lt;/span&gt;.Save);
        &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:blue;"&gt;false&lt;/span&gt;, rsvr.IsValid);
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Follow the same pattern to create rules and tests to ensure that the Outage start date is after the CourseDiary start date, to ensure that the Outage start date is before the CourseDiary end date and to ensure that the Outage end date is before the CourseDiary end date.&lt;/p&gt;

&lt;p&gt;To ensure that the Outage object does not appear in the navigation bar, decorate the Outage class with the NavigationItem attribute as follows:&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;NavigationItem&lt;/span&gt;(&lt;span style="color:blue;"&gt;false&lt;/span&gt;)]
&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Outage &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;BaseObject&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Lastly, we need to fix the error message for the CourseDiary by providing a specific message in the Rule:&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;RuleIsReferenced&lt;/span&gt;(
    &lt;span style="color:#a31515;"&gt;&amp;quot;No delete if referenced&amp;quot;&lt;/span&gt;,
    &lt;span style="color:#2b91af;"&gt;DefaultContexts&lt;/span&gt;.Delete,
    &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Course&lt;/span&gt;),
    &lt;span style="color:#a31515;"&gt;&amp;quot;Diary&amp;quot;&lt;/span&gt;,
    &lt;span style="color:#a31515;"&gt;&amp;quot;A Course Diary cannot be deleted if it is being used!&amp;quot;&lt;/span&gt;,
    InvertResult=&lt;span style="color:blue;"&gt;true&lt;/span&gt;)]&lt;/pre&gt;

&lt;p&gt;Right, now that we’ve done all the refactoring work, let’s make sure our tests still pass:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/garyshort/image_1B9E9214.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/garyshort/image_thumb_23860EA9.png" width="575" height="699" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;They do! Well that about wraps it up for this post, in the next post we’ll start the next use case, in the meantime you can find the refactored solution &lt;a href="http://community.devexpress.com/blogs/garyshort/rwa/Solution1AfterRefactor1.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:0611b57f-9e8e-4321-a643-552c96f04cbd" class="wlWriterSmartContent"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/XAF" rel="tag"&gt;XAF&lt;/a&gt;, &lt;a href="http://technorati.com/tags/Real+World+Application" rel="tag"&gt;Real World Application&lt;/a&gt;&lt;/div&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fcommunity.devexpress.com%2fblogs%2fgaryshort%2farchive%2f2008%2f10%2f14%2fxaf-rwa-refactor-1.aspx&amp;amp;title=XAF+RWA+Refactor+%231"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=238121" width="1" height="1"&gt;</content><author><name>Gary Short (Developer Express)</name><uri>http://community.devexpress.com/members/Gary-Short-_2800_Developer-Express_2900_.aspx</uri></author></entry><entry><title>XAF RWA Code #1</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/garyshort/archive/2008/10/10/xaf-rwa-code-1.aspx" /><id>http://community.devexpress.com/blogs/garyshort/archive/2008/10/10/xaf-rwa-code-1.aspx</id><published>2008-10-10T15:04:27Z</published><updated>2008-10-10T15:04:27Z</updated><content type="html">&lt;p&gt;Now that we’ve done our design, it’s time to code it up. So first thing to do is to add an empty solution to Visual Studio. Next, add to that a new test project (yes we’re going to to a bit of &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;TDD&lt;/a&gt;). Now we are going to add the following test&lt;/p&gt;  &lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;TestDiaryHasName() {
    &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;UnitOfWork &lt;/span&gt;uow = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;UnitOfWork&lt;/span&gt;())
    {
        &lt;span style="color:#2b91af;"&gt;CourseDiary &lt;/span&gt;diary = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CourseDiary&lt;/span&gt;(uow);
        diary.Name = &lt;span style="color:#a31515;"&gt;&amp;quot;Test Diary&amp;quot;&lt;/span&gt;;

        &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.IsNotNull(diary.Name);
    }           
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;This test will test whether or not our CourseDiary is capable of storing a name variable. When you type / paste this code then you will notice lots of problems with it in the first instance and the code will not compile. Let’s carry out some steps to ensure that it does build – using the TDD philosophy of doing the least thing that will make the test pass.&lt;/p&gt;

&lt;p&gt;Firstly add an &lt;a href="http://www.devexpress.com/xaf"&gt;XAF&lt;/a&gt; Windows Forms Application and in the Solution1.Module project add a domain object named CourseDiary. In CourseDiary add a string property (CR shortcut xps) named “Name”. Now go back to your test project and add references to the following assemblies:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Solution1.Module &lt;/li&gt;

  &lt;li&gt;DevExpress.Data.V8.2 &lt;/li&gt;

  &lt;li&gt;DevExpress.Persistent.BaseImpl.v8.2 &lt;/li&gt;

  &lt;li&gt;DevExpress.Xpo.v8.2 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now add any using statements required. Having done that your test should compile, run and pass. If not, then fix any problems that the compiler or test runner throws your way and try again. Once you have gotten this test working we can move on to the next test.&lt;/p&gt;

&lt;p&gt;The next test will test the CourseDiary’s ability to store a description variable and it looks like this:&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;TestDiaryHasDescription() {
    &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;UnitOfWork &lt;/span&gt;uow = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;UnitOfWork&lt;/span&gt;())
    {
        &lt;span style="color:#2b91af;"&gt;CourseDiary &lt;/span&gt;diary = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CourseDiary&lt;/span&gt;(uow);
        diary.Description = &lt;span style="color:#a31515;"&gt;&amp;quot;Description&amp;quot;&lt;/span&gt;;

        &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.IsNotNull(diary.Description);
    } 
}&lt;/pre&gt;

&lt;p&gt;Again the test will not compile until you add the Description property to the CourseDiary object. Having done the simplest thing that will make the test pass, your test should now compile, run and pass. Now repeat this process for the StartDate, EndDate and Outages properties, creating the following tests (The CR shortcut for a DateTime property is xpd8):&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;TestDiaryHasStartDate() {
    &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;UnitOfWork &lt;/span&gt;uow = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;UnitOfWork&lt;/span&gt;()) {
        &lt;span style="color:#2b91af;"&gt;CourseDiary &lt;/span&gt;diary = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CourseDiary&lt;/span&gt;(uow);
        diary.StartDate = &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;.Parse(&lt;span style="color:#a31515;"&gt;&amp;quot;01/04/2009 00:00:01&amp;quot;&lt;/span&gt;);

        &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.IsNotNull(diary.StartDate);
    }
}

[&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;TestDiaryHasEndDate() {
    &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;UnitOfWork &lt;/span&gt;uow = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;UnitOfWork&lt;/span&gt;()) {
        &lt;span style="color:#2b91af;"&gt;CourseDiary &lt;/span&gt;diary = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CourseDiary&lt;/span&gt;(uow);
        diary.EndDate = &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;.Parse(&lt;span style="color:#a31515;"&gt;&amp;quot;31/10/2009 23:59:59&amp;quot;&lt;/span&gt;);

        &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.IsNotNull(diary.EndDate);
    }
}

[&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;TestDiaryHasOutages() {
    &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;UnitOfWork &lt;/span&gt;uow = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;UnitOfWork&lt;/span&gt;()) {
        &lt;span style="color:#2b91af;"&gt;CourseDiary &lt;/span&gt;diary = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CourseDiary&lt;/span&gt;(uow);
        
        &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.IsNotNull(diary.Outages);
    }
}&lt;/pre&gt;

&lt;p&gt;The Outages property is a special case because we first have to add a new domain object named Outage and then add a collection property to the CourseDiary (CR shortcut xpcl) like so:&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;Association&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;CourseDiary-Outages&amp;quot;&lt;/span&gt;)]
&lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XPCollection&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Outage&lt;/span&gt;&amp;gt; Outages {
    &lt;span style="color:blue;"&gt;get &lt;/span&gt;{
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;GetCollection&amp;lt;&lt;span style="color:#2b91af;"&gt;Outage&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Outages&amp;quot;&lt;/span&gt;);
    }
}&lt;/pre&gt;

&lt;p&gt;And an attribute property to the Outage pointing back to the CourseDiary (CR shortcut xpa) like so:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;private &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CourseDiary &lt;/span&gt;_CourseDiary;
[&lt;span style="color:#2b91af;"&gt;Association&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;CourseDiary-Outages&amp;quot;&lt;/span&gt;)]
&lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CourseDiary &lt;/span&gt;CourseDiary {
    &lt;span style="color:blue;"&gt;get &lt;/span&gt;{
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;_CourseDiary;
    }
    &lt;span style="color:blue;"&gt;set &lt;/span&gt;{
        SetPropertyValue(&lt;span style="color:#a31515;"&gt;&amp;quot;CourseDiary&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;ref &lt;/span&gt;_CourseDiary, &lt;span style="color:blue;"&gt;value&lt;/span&gt;);
    }
}&lt;/pre&gt;

&lt;p&gt;Once you have complete this work, place the cursor in the test class name in the editor, right click and select “run tests”. All your tests should now run and pass, like so:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/garyshort/image_5CDD149C.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/garyshort/image_thumb_01CAAF49.png" width="398" height="136" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Now add the following test for the Course Object:&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;TestCourseHasName() {
    &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;UnitOfWork &lt;/span&gt;uow = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;UnitOfWork&lt;/span&gt;()) {
        &lt;span style="color:#2b91af;"&gt;Course &lt;/span&gt;course = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Course&lt;/span&gt;(uow);
        course.Name = &lt;span style="color:#a31515;"&gt;&amp;quot;Test Course&amp;quot;&lt;/span&gt;;

        &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.IsNotNull(course.Name);
    }
}

[&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;TestCourseHasDescription() {
    &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;UnitOfWork &lt;/span&gt;uow = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;UnitOfWork&lt;/span&gt;()) {
        &lt;span style="color:#2b91af;"&gt;Course &lt;/span&gt;course = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Course&lt;/span&gt;(uow);
        course.Description = &lt;span style="color:#a31515;"&gt;&amp;quot;Test course description&amp;quot;&lt;/span&gt;;

        &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.IsNotNull(course.Description);
    }
}

[&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;TestCourseHasDiary() {
    &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;UnitOfWork &lt;/span&gt;uow = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;UnitOfWork&lt;/span&gt;()) {
        &lt;span style="color:#2b91af;"&gt;Course &lt;/span&gt;course = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Course&lt;/span&gt;(uow);
        &lt;span style="color:#2b91af;"&gt;CourseDiary &lt;/span&gt;diary = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CourseDiary&lt;/span&gt;(uow);
        course.Diary = diary;
        
        &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.IsNotNull(course.Diary);
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Add the appropriate properties to allow the tests to pass, remembering that CourseDiary has a 1:M relationship with Course which is expressed as follows on the Course:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;private &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CourseDiary &lt;/span&gt;_Diary;
[&lt;span style="color:#2b91af;"&gt;Association&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;CourseDiary-Courses&amp;quot;&lt;/span&gt;)]
&lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CourseDiary &lt;/span&gt;Diary {
    &lt;span style="color:blue;"&gt;get &lt;/span&gt;{
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;_Diary;
    }
    &lt;span style="color:blue;"&gt;set &lt;/span&gt;{
        SetPropertyValue(&lt;span style="color:#a31515;"&gt;&amp;quot;Diary&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;ref &lt;/span&gt;_Diary, &lt;span style="color:blue;"&gt;value&lt;/span&gt;);
    }
}&lt;/pre&gt;

&lt;p&gt;and as follows on the CourseDiary:&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;Association&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;CourseDiary-Courses&amp;quot;&lt;/span&gt;)]
&lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XPCollection&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Course&lt;/span&gt;&amp;gt; Courses {
    &lt;span style="color:blue;"&gt;get &lt;/span&gt;{
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;GetCollection&amp;lt;&lt;span style="color:#2b91af;"&gt;Course&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Courses&amp;quot;&lt;/span&gt;);
    }
}&lt;/pre&gt;

&lt;p&gt;Now that we have built our Course and our CourseDiary classes, it’s time to look at the Outage that we stubbed out in order to complete the CourseDiary class. Let’s go ahead and create tests and properties for Name, Description, StartDate and StopDate following the pattern above.&lt;/p&gt;

&lt;p&gt;Now we can turn out attention to the constraints we had on our objects. One of constraints we had was that a Course had to have a CourseDiary. So to enforce that we can decorate the Diary property on the Course with the RuleRequiredField attribute, like so:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;private &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CourseDiary &lt;/span&gt;_Diary;
[&lt;span style="color:#2b91af;"&gt;RuleRequiredField&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Course must have Diary&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;DefaultContexts&lt;/span&gt;.Save)]
[&lt;span style="color:#2b91af;"&gt;Association&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;CourseDiary-Courses&amp;quot;&lt;/span&gt;)]        
&lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CourseDiary &lt;/span&gt;Diary {
    &lt;span style="color:blue;"&gt;get &lt;/span&gt;{
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;_Diary;
    }
    &lt;span style="color:blue;"&gt;set &lt;/span&gt;{
        SetPropertyValue(&lt;span style="color:#a31515;"&gt;&amp;quot;Diary&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;ref &lt;/span&gt;_Diary, &lt;span style="color:blue;"&gt;value&lt;/span&gt;);
    }
}&lt;/pre&gt;

&lt;p&gt;Having added a reference to the appropriate assembly (DevExpress.Persistent.Base.v8.2),&amp;#160; we can write a test to ensure that rule is enforced like this:&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;TestCourseMustHaveDiary() {
    &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;UnitOfWork &lt;/span&gt;uow = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;UnitOfWork&lt;/span&gt;()) {
        &lt;span style="color:#2b91af;"&gt;Course &lt;/span&gt;course = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Course&lt;/span&gt;(uow);
        &lt;span style="color:#2b91af;"&gt;RuleSet &lt;/span&gt;ruleSet = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RuleSet&lt;/span&gt;();
        &lt;span style="color:#2b91af;"&gt;RuleSetValidationResult &lt;/span&gt;rsvr = ruleSet.ValidateTarget(course, &lt;span style="color:#2b91af;"&gt;DefaultContexts&lt;/span&gt;.Save);
        &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:blue;"&gt;false&lt;/span&gt;,rsvr.IsValid);
    }
}&lt;/pre&gt;

&lt;p&gt;Another constraint that we had was that we can’t delete a CourseDiary if it is referenced by a Course object. The first thing we have to do to enforce this is to add the RuleIsReferenced attribute to the CourseDiary class, like so:&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;RuleIsReferenced&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;No delete if referenced&amp;quot;&lt;/span&gt;,&lt;span style="color:#2b91af;"&gt;DefaultContexts&lt;/span&gt;.Delete,&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Course&lt;/span&gt;),&lt;span style="color:#a31515;"&gt;&amp;quot;Diary&amp;quot;&lt;/span&gt;,InvertResult=&lt;span style="color:blue;"&gt;true&lt;/span&gt;)]&lt;/pre&gt;

&lt;p&gt;Notice the use of the InvertResult parameter which makes this rule “say” IsNotReferenced, which is what we want in this case. Now that we have decorated the class with this attribute, we can go ahead and write a test for it:&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;TestDiaryCantBeDeletedWhenReferenced() {
    &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;UnitOfWork &lt;/span&gt;uow = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;UnitOfWork&lt;/span&gt;())
    {
        &lt;span style="color:#2b91af;"&gt;Course &lt;/span&gt;course = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Course&lt;/span&gt;(uow);
        &lt;span style="color:#2b91af;"&gt;CourseDiary &lt;/span&gt;diary = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CourseDiary&lt;/span&gt;(uow);
        course.Diary = diary;
        &lt;span style="color:#2b91af;"&gt;RuleSet &lt;/span&gt;ruleSet = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RuleSet&lt;/span&gt;();
        &lt;span style="color:#2b91af;"&gt;RuleSetValidationResult &lt;/span&gt;rsvr = ruleSet.ValidateTarget(diary, &lt;span style="color:#2b91af;"&gt;DefaultContexts&lt;/span&gt;.Delete);
        &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:blue;"&gt;false&lt;/span&gt;, rsvr.IsValid);
    }            
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Another constraint that we had was that we cannot edit a CourseDiary in such a way as to invalidate a Booking. At this point in time we don’t have the Booking class as this UC does not cover it. In such a scenario the developer, using TDD, would seek to &lt;a href="http://en.wikipedia.org/wiki/Mock_Object"&gt;mock&lt;/a&gt; out the the Booking class. In this case, however, I feel that to go off into the realms of mocks might cloud what we are doing here (if anyone feels strongly that I’m wrong, feel free to comment and I will consider using mocks in a later post), it would certainly make this post, which is now reaching epic proportion, significantly longer.&lt;/p&gt;

&lt;p&gt;So having decided to leave any dependency on the Booking class until we actually have that class, we are finished with our constraints. All that remains now is for us to add tests to Create, Edit and Delete our Course, CourseDiary and Outage classes (in the appropriate test classes of course) and we are done. I shan’t bother describing the tests here, they follow the pattern already set, I will link to the solution from this post and you can download and examine the these tests at your leisure.&lt;/p&gt;

&lt;p&gt;Having created these tests, let’s run all the test to see if our code is still working&lt;/p&gt;

&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/garyshort/image_4E8E75DF.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/garyshort/image_thumb_1DABBE74.png" width="437" height="499" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Seeing that it is, we are now safe to run our solution and see what happens:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/garyshort/image_619F7CBE.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/garyshort/image_thumb_24BAD51F.png" width="440" height="329" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Yep, seems to be working fine!&lt;/p&gt;

&lt;p&gt;Okay so we’ve completed our use case and it’s time to ship our code to the testing server where our users can play with it. Is our code perfect? Well no, there are a lot of things I’ve left for our users to “find” and we will fix those in the refactoring phase. In the meantime, why don’t you leave a comment with the things that you find that need to be fixed? To do that you’ll need &lt;a href="http://community.devexpress.com/blogs/garyshort/Solution1.zip"&gt;the solution of course&lt;/a&gt;. Have fun, and I’ll see you next time!&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:fd499ecd-a1b0-469c-968b-927e9b7bfd5c" class="wlWriterSmartContent"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/Real+World+Application" rel="tag"&gt;Real World Application&lt;/a&gt;, &lt;a href="http://technorati.com/tags/XAF" rel="tag"&gt;XAF&lt;/a&gt;&lt;/div&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fcommunity.devexpress.com%2fblogs%2fgaryshort%2farchive%2f2008%2f10%2f10%2fxaf-rwa-code-1.aspx&amp;amp;title=XAF+RWA+Code+%231"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=237801" width="1" height="1"&gt;</content><author><name>Gary Short (Developer Express)</name><uri>http://community.devexpress.com/members/Gary-Short-_2800_Developer-Express_2900_.aspx</uri></author><category term="Real World App" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/Real+World+App/default.aspx" /></entry><entry><title>XAF RWA Just in Time Design #1</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/garyshort/archive/2008/10/08/xaf-rwa-just-in-time-design-1.aspx" /><id>http://community.devexpress.com/blogs/garyshort/archive/2008/10/08/xaf-rwa-just-in-time-design-1.aspx</id><published>2008-10-08T14:28:26Z</published><updated>2008-10-08T14:28:26Z</updated><content type="html">&lt;p&gt;Now that we have &lt;a href="http://community.devexpress.com/blogs/garyshort/archive/2008/10/07/xaf-rwa-use-case-1.aspx"&gt;our first use case&lt;/a&gt;, it’s time to do a little design work. The first task we have to complete is to identify object candidates, that is things that might be coded up as objects in our solution. The easiest way, I find, to do that is to list the nouns in the use case, so let’s do that now.&lt;/p&gt;  &lt;p&gt;The nouns are:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Administrator &lt;/li&gt;    &lt;li&gt;Diary &lt;/li&gt;    &lt;li&gt;Course &lt;/li&gt;    &lt;li&gt;Booking &lt;/li&gt;    &lt;li&gt;Outage &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Examining the list above it is clear that the nouns 2 through 5 are good candidates for objects but Administrator is not so clear because, at this point, it is not obvious if Administrator should be an object or if it is an attribute of another, as yet undefined, object (Employee say). So, for now, we’ll not include it as an object, safe in the knowledge that if we change our minds, we can fix it during the refactoring phase.&lt;/p&gt;  &lt;p&gt;Booking too, though an obvious candidate, is not really part of this use case. Certainly both Diary and Outage objects have a dependency on Booking, as we’ll see later, but this dependency can be mocked during testing of this use case solution and so, for now, we can afford to ignore it.&lt;/p&gt;  &lt;p&gt;The next task we have to complete is to decide what behaviour our objects are going to have. A good way to get a “first pass” at object behaviour is to look at the verbs in the use case, so we’ll go ahead and do that.&lt;/p&gt;  &lt;p&gt;The verbs are:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Select &lt;/li&gt;    &lt;li&gt;Create &lt;/li&gt;    &lt;li&gt;Logs on &lt;/li&gt;    &lt;li&gt;Edit &lt;/li&gt;    &lt;li&gt;Delete &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Now that we can see them clearly, we notice that we don’t have to pay them a lot of notice as the CRUD will be handled by &lt;a href="http://www.devexpress.com/Products/NET/ORM/"&gt;XPO&lt;/a&gt; (the orm tool under &lt;a href="http://www.devexpress.com/xaf"&gt;XAF&lt;/a&gt;) and the “logs on” element we can assume we can handle via the security module (again safe in the knowledge that if we are wrong we can fix it in the refactoring phase).&lt;/p&gt;  &lt;p&gt;Now we need to look at what constraints we have on our objects. From the use case we can see that we have a constraint around tee-time bookings with regard to the fact that we can’t create or edit an outage, nor can we edit a diary if it is going to invalidate a tee-time booking. So let’s decide that we are not going to allow those processes to occur and let’s document that decision.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Business Rule:&lt;/strong&gt; 001&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Use Case Reference      &lt;br /&gt;&lt;/strong&gt;001 paragraphs 2.1.4, 2.3.3 and 2.4.4&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Rule&lt;/strong&gt;     &lt;br /&gt;Tee-time bookings cannot be invalidated by the creation or editing of an outage, nor by the editing of a diary.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Action to be Taken      &lt;br /&gt;&lt;/strong&gt;On the aforementioned events a search will be made for affected bookings, if there are any then an error message will be presented to the user and the event cancelled.&lt;/p&gt;  &lt;p&gt;There is also a constraint around the deletion of course diaries in as much as they cannot be deleted if they are assigned to a course, so let’s go ahead and document that decision too.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Business Rule:&lt;/strong&gt; 002&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Use Case Reference      &lt;br /&gt;&lt;/strong&gt;001 paragraph 2.2.4&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Rule&lt;/strong&gt;     &lt;br /&gt;A course diary cannot be deleted if it is currently assigned to a course.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Action to be Taken      &lt;br /&gt;&lt;/strong&gt;On the aforementioned event a search will be made for affected courses and if any are found then an error message will be presented to the user and the event cancelled.&lt;/p&gt;  &lt;p&gt;Having identified the objects, their knowledge (the properties they have) and their behaviour (the functions that can be called on them) and having documented certain business rules, the above post, along with the Use Case, represents a minimal set of documentation that an agile team (in this case us) can use to go ahead and create some code. And that is just what we’ll do in the next post.&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fcommunity.devexpress.com%2fblogs%2fgaryshort%2farchive%2f2008%2f10%2f08%2fxaf-rwa-just-in-time-design-1.aspx&amp;amp;title=XAF+RWA+Just+in+Time+Design+%231"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=237539" width="1" height="1"&gt;</content><author><name>Gary Short (Developer Express)</name><uri>http://community.devexpress.com/members/Gary-Short-_2800_Developer-Express_2900_.aspx</uri></author><category term="Real World App" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/Real+World+App/default.aspx" /></entry><entry><title>XAF RWA Use Case #1</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/garyshort/archive/2008/10/07/xaf-rwa-use-case-1.aspx" /><id>http://community.devexpress.com/blogs/garyshort/archive/2008/10/07/xaf-rwa-use-case-1.aspx</id><published>2008-10-07T13:41:31Z</published><updated>2008-10-07T13:41:31Z</updated><content type="html">&lt;p&gt;It’s time to create our first use case, so where to start? Well it seems clear to me that a top down approach is needed here, after all you can’t book tee times on a course that doesn’t exist and you can’t book tee times on a course when you don’t know when it opens, right? So our first use case has to be for the administration system and has to be around the maintenance (create, read, update and delete functions) of our course diaries. The use case follows below. You will notice that I don’t favour the fully dressed style of use case for this project as I think it is “too much” for blog posting. Readers who wish to find out more about use cases should read the excellent book &lt;a href="http://www.amazon.co.uk/Writing-Effective-Crystal-Software-Development/dp/0201702258/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1223376920&amp;amp;sr=1-1"&gt;Writing Effective Use Cases&lt;/a&gt; by &lt;a href="http://alistair.cockburn.us/"&gt;Alistair Cockburn&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/Alistair_Cockburn"&gt;Wikipedia&lt;/a&gt;). Readers may also wish to read about (the more fashionable) &lt;a href="http://www.amazon.co.uk/User-Stories-Applied-Development-Addison-Wesley/dp/0321205685/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1223386065&amp;amp;sr=8-1"&gt;user stories&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Now I know this is going to upset the architectural fundamentalists, but I’m going to roll up related functionality into a single use case. I’m doing this for purely aesthetic reasons, to enable me to adhere to the four post policy that &lt;a href="http://community.devexpress.com/blogs/garyshort/archive/2008/10/07/xaf-rwa-how-we-will-proceed.aspx"&gt;I described earlier&lt;/a&gt;. Just to keep us on the straight and narrow though, it is worth pointing out to our less experienced readers that, under normal conditions, each use case would deal with only one… well, use case :-) &lt;/p&gt;  &lt;p&gt;As an aside, for those of you who are unfamiliar with the business area (and I’m assuming that’s the majority) the course diary describes what day of the year the course opens and closes and the first and last tee times, as well as any “outages” (for competitions etc). This is because it takes time (say 5 hours) to complete a round of golf and the times at which you tee off, and thus the time you are expected to return to the club house, are set up so that you are playing in day light during both winter and summer. Okay, so let’s get on with it.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Use Case: 001 Maintain Golf Course Diaries &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Primary Actor&lt;/strong&gt;     &lt;br /&gt;Administrator&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Priority&lt;/strong&gt;     &lt;br /&gt;High&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Frequency&lt;/strong&gt;     &lt;br /&gt;2/year&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Trigger&lt;/strong&gt;     &lt;br /&gt;Course diary maintenance required&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Main Success Scenario&lt;/strong&gt;     &lt;br /&gt;1. Administrator logs on to the system     &lt;br /&gt;2. Administrator elects to create a new course diary     &lt;br /&gt;3. Administrator creates a new course diary&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Extensions&lt;/strong&gt;     &lt;br /&gt;2.1.1 Administrator elects to edit a course diary     &lt;br /&gt;2.1.2 Administrator selects a course diary     &lt;br /&gt;2.1.3 Administrator edits a course diary     &lt;br /&gt;2.1.4 Course diary is edited if it does not invalidate future tee time bookings&lt;/p&gt;  &lt;p&gt;2.2.1 Administrator elects to delete a course diary    &lt;br /&gt;2.2.2 Administrator selects a course diary     &lt;br /&gt;2.2.3 Administrator deletes a course diary     &lt;br /&gt;2.2.4 Course diary is deleted if it is not in use&lt;/p&gt;  &lt;p&gt;2.3.1 Administrator elects to create an outage    &lt;br /&gt;2.3.2 Administrator creates an outage     &lt;br /&gt;2.3.3 Outage is create if it does not invalidate future tee time bookings&lt;/p&gt;  &lt;p&gt;2.4.1 Administrator elects to edit an outage    &lt;br /&gt;2.4.2 Administrator selects an outage     &lt;br /&gt;2.4.3 Administrator edits an outage     &lt;br /&gt;2.4.4 Outage is edited if it does not invalidate future tee time bookings&lt;/p&gt;  &lt;p&gt;2.5.1 Administrator elects to delete an outage    &lt;br /&gt;2.5.2 Administrator selects an outage     &lt;br /&gt;2.5.3 Administrator deletes an outage     &lt;br /&gt;2.5.4 Outage is deleted&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:71898fe6-f246-483c-8413-84822c29a346" class="wlWriterSmartContent"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/XAF" rel="tag"&gt;XAF&lt;/a&gt;, &lt;a href="http://technorati.com/tags/Real+World+Application" rel="tag"&gt;Real World Application&lt;/a&gt;, &lt;a href="http://technorati.com/tags/Use+Cases" rel="tag"&gt;Use Cases&lt;/a&gt;, &lt;a href="http://technorati.com/tags/User+Stories" rel="tag"&gt;User Stories&lt;/a&gt;&lt;/div&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fcommunity.devexpress.com%2fblogs%2fgaryshort%2farchive%2f2008%2f10%2f07%2fxaf-rwa-use-case-1.aspx&amp;amp;title=XAF+RWA+Use+Case+%231"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=237339" width="1" height="1"&gt;</content><author><name>Gary Short (Developer Express)</name><uri>http://community.devexpress.com/members/Gary-Short-_2800_Developer-Express_2900_.aspx</uri></author><category term="XAF" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/XAF/default.aspx" /><category term="Real World App" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/Real+World+App/default.aspx" /></entry><entry><title>XAF RWA – How we Will Proceed</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/garyshort/archive/2008/10/07/xaf-rwa-how-we-will-proceed.aspx" /><id>http://community.devexpress.com/blogs/garyshort/archive/2008/10/07/xaf-rwa-how-we-will-proceed.aspx</id><published>2008-10-07T10:39:19Z</published><updated>2008-10-07T10:39:19Z</updated><content type="html">&lt;p&gt;I just thought I’d drop you a short note to let you know how I propose to proceed with the &lt;a href="http://www.devexpress.com/xaf"&gt;XAF&lt;/a&gt; RWA. Each feature that we add will be done over four posts, the first post will contain the use case for the feature, the second post will contain the architectural decisions (as requested by some readers, more experienced readers may wish to skip this post), the third post will contain the build phase and finally, the fourth post will deal with any refactoring required.&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fcommunity.devexpress.com%2fblogs%2fgaryshort%2farchive%2f2008%2f10%2f07%2fxaf-rwa-how-we-will-proceed.aspx&amp;amp;title=XAF+RWA+%e2%80%93+How+we+Will+Proceed"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=237301" width="1" height="1"&gt;</content><author><name>Gary Short (Developer Express)</name><uri>http://community.devexpress.com/members/Gary-Short-_2800_Developer-Express_2900_.aspx</uri></author><category term="Real World App" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/Real+World+App/default.aspx" /></entry><entry><title>The Real World App</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/garyshort/archive/2008/10/06/the-real-world-app.aspx" /><id>http://community.devexpress.com/blogs/garyshort/archive/2008/10/06/the-real-world-app.aspx</id><published>2008-10-06T16:41:04Z</published><updated>2008-10-06T16:41:04Z</updated><content type="html">&lt;p&gt;As I hinted at before I left for the &lt;a href="http://community.devexpress.com/blogs/garyshort/archive/2008/10/06/uk-mvp-day-and-evangelism-the-old-fashioned-way.aspx"&gt;MVP Open Day&lt;/a&gt;, I am now ready to start the “Real World App” (hereafter referred to as RWA). To ensure that it is indeed a real world app. I have decided to re-create a system I have worked on previously, that way everyone can see that indeed it is real word and the scenario has not been artificially constructed in order to show &lt;a href="http://www.devexpress.com/xaf"&gt;XAF&lt;/a&gt; in the best light. So, without further ado, here is the scenario we will be working on:-&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;The coastal town of Duncodin-by-the-Sea (referred to as Duncodin from now on) lies in the north east of Scotland, not far from the historic home of golf at St. Andrews. Recently, a wealthy tycoon purchased several hundred acres of coastal property and intends to build three links golf courses there, one of which he hopes will be selected to be part of The (British) Open circuit.&lt;/p&gt;    &lt;p&gt;You have been selected to provide the Tee-time Booking System for this resort, and in particular you are to provide:-&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;A web&amp;#160; based tee-time booking system for use by visitors&lt;/li&gt;      &lt;li&gt;A win forms based tee-time booking system for use by a small call centre&lt;/li&gt;      &lt;li&gt;A win forms based administration system &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;The requirements for this system are fluid and you are to use an agile approach to constructing this software to more easily facilitate the changes which will be required as the requirements firm up.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I’ll publish the first use case for this system tomorrow.&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fcommunity.devexpress.com%2fblogs%2fgaryshort%2farchive%2f2008%2f10%2f06%2fthe-real-world-app.aspx&amp;amp;title=The+Real+World+App"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=237192" width="1" height="1"&gt;</content><author><name>Gary Short (Developer Express)</name><uri>http://community.devexpress.com/members/Gary-Short-_2800_Developer-Express_2900_.aspx</uri></author><category term="Real World App" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/Real+World+App/default.aspx" /></entry><entry><title>UK MVP Day and Evangelism the “Old Fashioned Way”</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/garyshort/archive/2008/10/06/uk-mvp-day-and-evangelism-the-old-fashioned-way.aspx" /><id>http://community.devexpress.com/blogs/garyshort/archive/2008/10/06/uk-mvp-day-and-evangelism-the-old-fashioned-way.aspx</id><published>2008-10-06T12:03:11Z</published><updated>2008-10-06T12:03:11Z</updated><content type="html">&lt;p&gt;So I’m back from the MVP Open Day, did you miss me? Whadda ya mean no?! LOL. Anyway, on the plane home I was sitting behind a woman from Edinburgh and a gentleman from the US. As they conversed during the journey, it became apparent to them both that they had once lived in the same small town in the US. “Wow, that’s amazing” proclaimed the woman; not really thought I, if you’d come to my “Science of Social Networking” talk then you’d have known that the work of Milgram et al, makes it quite likely actually.&lt;/p&gt;  &lt;p&gt;Speaking of my talk, I turned up running a little late, as the chap before me had over run by 10 minutes, to find that the projector had taken umbrage at the very thought of a Mac being connected to a piece of Microsoft equipment, and point blank refused to speak to it at all. Not to worry, the AV tech. soon arrived on the scene, putting my mind at ease. However, my ease was to be short lived as we had the following conversation:&lt;/p&gt;  &lt;p&gt;Him: “Having problems getting connected mate?”    &lt;br /&gt;Me: “Yeah”     &lt;br /&gt;Him: “Not to worry, we’ll have you set up in a jiffy”     &lt;br /&gt;Me: “Good, as we’re running a bit late and I should have started by now”     &lt;br /&gt;Him: “Umm, hang on, this is a Mac”     &lt;br /&gt;Me: “That’s right, it is”     &lt;br /&gt;Him: “Umm, yeeeeeeeees, well you see…. sorry mate, no idea, bye!”     &lt;br /&gt;Me: “Okay, anyone got a white board marker?”&lt;/p&gt;  &lt;p&gt;I then proceeded to deliver my talk the “old fashioned” way, just chalk and talk (well white board, pen and talk, but you get the idea). As it happens the audience seemed pretty happy with that approach as the day had been a little like “death by Powerpoint” up until then, and I only really needed to “chalk” up my equations. Just to add a little bit of pressure (‘cos otherwise it would have been easy right?) Toby Richards (General Manager, Community Support Services for Microsoft) was in the room. I think it must have gone okay though, as he asked me to send him my slide deck. Of course, he maybe wanted to check that I had one in the first place and wasn’t just conning everyone. :-)&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c323705a-8caa-4c70-9aed-795389700d65" class="wlWriterSmartContent"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/MVP+UK+Open+Day+2008" rel="tag"&gt;MVP UK Open Day 2008&lt;/a&gt;, &lt;a href="http://technorati.com/tags/Evangelism" rel="tag"&gt;Evangelism&lt;/a&gt;&lt;/div&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fcommunity.devexpress.com%2fblogs%2fgaryshort%2farchive%2f2008%2f10%2f06%2fuk-mvp-day-and-evangelism-the-old-fashioned-way.aspx&amp;amp;title=UK+MVP+Day+and+Evangelism+the+%e2%80%9cOld+Fashioned+Way%e2%80%9d"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=237156" width="1" height="1"&gt;</content><author><name>Gary Short (Developer Express)</name><uri>http://community.devexpress.com/members/Gary-Short-_2800_Developer-Express_2900_.aspx</uri></author><category term="Community" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/Community/default.aspx" /></entry><entry><title>UK MVP Open Day</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/garyshort/archive/2008/10/01/uk-mvp-open-day.aspx" /><id>http://community.devexpress.com/blogs/garyshort/archive/2008/10/01/uk-mvp-open-day.aspx</id><published>2008-10-01T16:40:23Z</published><updated>2008-10-01T16:40:23Z</updated><content type="html">&lt;p&gt;Tomorrow I’m off to the UK MVP Open Day where I’ll be speaking on the topic of “The Science of Social Networking” if you are UK based and going to be there then don’t forget to come and say hello.&lt;/p&gt;  &lt;p&gt;On a different note, I’ve decided what our “Real World Application” is going to be; it’s a real “real world” application, I’ve just changed some of the names to protect the innocent, that way no one can accuse me of making the scenario fit the strengths of &lt;a href="http://www.devexpress.com/xaf"&gt;XAF&lt;/a&gt;. But this is just a teaser of course, there’ll be more information on this front on Monday when I’m back from the Open Day. Until then, happy coding! :-)&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:dd40b42e-2f26-45e8-9b45-e547ce75abf9" class="wlWriterSmartContent"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/MVP" rel="tag"&gt;MVP&lt;/a&gt;, &lt;a href="http://technorati.com/tags/XAF" rel="tag"&gt;XAF&lt;/a&gt;&lt;/div&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fcommunity.devexpress.com%2fblogs%2fgaryshort%2farchive%2f2008%2f10%2f01%2fuk-mvp-open-day.aspx&amp;amp;title=UK+MVP+Open+Day"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=236800" width="1" height="1"&gt;</content><author><name>Gary Short (Developer Express)</name><uri>http://community.devexpress.com/members/Gary-Short-_2800_Developer-Express_2900_.aspx</uri></author><category term="XAF" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/XAF/default.aspx" /></entry><entry><title>The Curious Case of the Ketchup and the Missing Booth</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/garyshort/archive/2008/09/30/the-curious-case-of-the-ketchup-and-the-missing-booth.aspx" /><id>http://community.devexpress.com/blogs/garyshort/archive/2008/09/30/the-curious-case-of-the-ketchup-and-the-missing-booth.aspx</id><published>2008-09-30T13:22:33Z</published><updated>2008-09-30T13:22:33Z</updated><content type="html">&lt;p&gt;So the BASTA conference wound down with a party and, as with every conference, the organizers tried to give the speakers and exhibitors a gimmicky gift with which to remember the conference by. Now, since the party had a BBQ theme, what better gift that your very own, personalized, bottles of Heinz Tomato Ketchup? And so now, I am the proud owner of my very own ketchup (pictured below).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/garyshort/P5230084_2660BB18.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="P5230084" border="0" alt="P5230084" src="http://community.devexpress.com/blogs/garyshort/P5230084_thumb_33971E5E.jpg" width="160" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;At the end of the conference, Oliver and I headed off to the airport. We checked in the Booth (pictured below) and a case containing some left over T-Shirts, CDs and brochures. We duly boarded our flight to London and then caught our connection flight to Edinburgh (ah it was nice to be back in Bonny Scotland). A quick trip to the luggage carrousel, however, showed that our booth was missing. Apparently the baggage handlers and Frankfurt Airport decided that, whilst we probably did need our T-Shirts etc, we could manage without our booth for an extra day or two. So, our booth has been enjoying a couple of days R&amp;amp;R in Germany before deciding to come back home. :-)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/garyshort/597485_66F2E1BA.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="597485" border="0" alt="597485" src="http://community.devexpress.com/blogs/garyshort/597485_thumb_43E2704A.jpg" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fcommunity.devexpress.com%2fblogs%2fgaryshort%2farchive%2f2008%2f09%2f30%2fthe-curious-case-of-the-ketchup-and-the-missing-booth.aspx&amp;amp;title=The+Curious+Case+of+the+Ketchup+and+the+Missing+Booth"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=236678" width="1" height="1"&gt;</content><author><name>Gary Short (Developer Express)</name><uri>http://community.devexpress.com/members/Gary-Short-_2800_Developer-Express_2900_.aspx</uri></author><category term="Community" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/Community/default.aspx" /></entry><entry><title>Basta Germany Day 3 - XAF, and the Erica Bomb</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/garyshort/archive/2008/09/27/basta-germany-day-3-xaf-and-the-erica-bomb.aspx" /><id>http://community.devexpress.com/blogs/garyshort/archive/2008/09/27/basta-germany-day-3-xaf-and-the-erica-bomb.aspx</id><published>2008-09-27T18:47:00Z</published><updated>2008-09-27T18:47:00Z</updated><content type="html">&lt;p&gt;Well day three of the conference was good; the delegates seemed a little tired (possibly due to the long hours that they worked at the conference) and they didn&amp;#39;t seem much interested in hearing about just how fantastic XAF and XPO are (of course we know that already, right?). So what should a good evangelist do in this situation? We turned on the DevExpress Channel and ran Erica&amp;#39;s videos on the plasma screen.&lt;/p&gt;
&lt;p&gt;The effect was almost immediate; people stopped chatting and looked around to watch the screen. I have named this effect the &amp;quot;Erica Bomb&amp;quot;, anyone caught in the &amp;quot;blast radius&amp;quot; is compelled to stop what they are doing and watch. I think we&amp;#39;ll be using this tatic again in the the future. &lt;img src="http://community.devexpress.com/emoticons/emotion-5.gif" alt="Wink" /&gt;&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=236445" width="1" height="1"&gt;</content><author><name>Gary Short (Developer Express)</name><uri>http://community.devexpress.com/members/Gary-Short-_2800_Developer-Express_2900_.aspx</uri></author><category term="XPO" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/XPO/default.aspx" /><category term="XAF" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/XAF/default.aspx" /></entry><entry><title>BASTA Germany Day 2</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/garyshort/archive/2008/09/25/basta-germany-day-2.aspx" /><id>http://community.devexpress.com/blogs/garyshort/archive/2008/09/25/basta-germany-day-2.aspx</id><published>2008-09-25T07:27:00Z</published><updated>2008-09-25T07:27:00Z</updated><content type="html">&lt;p&gt;It was another brisk day on the booth yesterday. There was a lot of interest in XAF and XPO, as there was on the first day. However, yesterday also saw a lot of interest in our WPF grid, with many people leaving the booth, after the demo, to go and search out the beta version. There was a little interest in the Silverlight grid also, but not so much as in WPF.&lt;/p&gt;
&lt;p&gt;One difference between this conference here in Germany, and events I&amp;#39;ve attended in the US, is that here in Europe there doesn&amp;#39;t seem to be much interest in components for Sharepoint, where as I noticed that was a &amp;quot;big deal&amp;quot; in the US.&lt;/p&gt;
&lt;p&gt;Yesterday afternoon saw quite a bit of interest in CR/R! after one of the speakers (speaking on pragmatic C sharp) told his audience that no one should be programming these days without a tool like ours! Quite a recommendation that sent a number of interested people to the booth.&lt;/p&gt;
&lt;p&gt;Well that is about it from me for now, it&amp;#39;s time to get going on day 3 - bye for now.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=236193" width="1" height="1"&gt;</content><author><name>Gary Short (Developer Express)</name><uri>http://community.devexpress.com/members/Gary-Short-_2800_Developer-Express_2900_.aspx</uri></author><category term="Community" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/Community/default.aspx" /><category term="XPO" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/XPO/default.aspx" /><category term="XAF" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/XAF/default.aspx" /></entry><entry><title>BASTA Germany Day 1</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/garyshort/archive/2008/09/24/basta-germany-day-1.aspx" /><id>http://community.devexpress.com/blogs/garyshort/archive/2008/09/24/basta-germany-day-1.aspx</id><published>2008-09-24T07:56:00Z</published><updated>2008-09-24T07:56:00Z</updated><content type="html">&lt;p&gt;I am back on the DevExpress booth at the BASTA conference. As I write this Oliver is demo&amp;#39;ng XAF to an eager crowd. I say he&amp;#39;s demo&amp;#39;ng XAF, but since it&amp;#39;s in German, and I don&amp;#39;t speak the language, he could of course be giving them a run down of his favourite bars in the area; hey, maybe that&amp;#39;s why they are so interested do you think? Nah, I&amp;#39;m sure it&amp;#39;s XAF. &lt;img src="http://community.devexpress.com/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;/p&gt;
&lt;p&gt;Seriously, the crowd here just seem to &amp;quot;get&amp;quot; the whole application framework, ORM &amp;quot;thing&amp;quot;. Yesterday, whilst Oliver delivered his sessions, I demo&amp;#39;d XAF and a few of our other products (CR/R! always go down well) and even though I was speaking english, the crowd were impressed with the products we have. A couple of them were going to trial XAF on small projects when they got back to their day jobs.&lt;/p&gt;
&lt;p&gt;So, that was yesterday - a pretty fruitful day. Tune in tomorrow to find out what today brings.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=236045" width="1" height="1"&gt;</content><author><name>Gary Short (Developer Express)</name><uri>http://community.devexpress.com/members/Gary-Short-_2800_Developer-Express_2900_.aspx</uri></author><category term="Community" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/Community/default.aspx" /><category term="XAF" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/XAF/default.aspx" /></entry><entry><title>XAF and XPO in Germany</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/garyshort/archive/2008/09/18/xaf-and-xpo-in-germany.aspx" /><id>http://community.devexpress.com/blogs/garyshort/archive/2008/09/18/xaf-and-xpo-in-germany.aspx</id><published>2008-09-18T17:11:17Z</published><updated>2008-09-18T17:11:17Z</updated><content type="html">&lt;p&gt;Oliver and I are off to the &lt;a href="http://it-republik.de/dotnet/basta/"&gt;BASTA conference&lt;/a&gt; in Germany where we’ll be flying the DevExpress flag. So, as always, if there are any of our customers attending the conference, don’t forget to stop by the booth and say hello – oh, and collect a coveted DevEx T-shirt of course. :-)&lt;/p&gt;  &lt;p&gt;I’m not sure what the connectivity will be like at the conference or at the hotel, so blog postings may be a bit light next week, but if they are, don’t forget you can still keep in contact with me via Twitter at &lt;a href="http://www.twitter.com/garyshort"&gt;http://www.twitter.com/garyshort&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Anyway, until we return, sit back, relax and help yourself to a beer from the fridge.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2567b652-cc0c-4dd8-8486-71b0d34b7ce7" class="wlWriterSmartContent"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/XAF" rel="tag"&gt;XAF&lt;/a&gt;, &lt;a href="http://technorati.com/tags/XPO" rel="tag"&gt;XPO&lt;/a&gt;, &lt;a href="http://technorati.com/tags/BASTA" rel="tag"&gt;BASTA&lt;/a&gt;&lt;/div&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fcommunity.devexpress.com%2fblogs%2fgaryshort%2farchive%2f2008%2f09%2f18%2fxaf-and-xpo-in-germany.aspx&amp;amp;title=XAF+and+XPO+in+Germany"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=235352" width="1" height="1"&gt;</content><author><name>Gary Short (Developer Express)</name><uri>http://community.devexpress.com/members/Gary-Short-_2800_Developer-Express_2900_.aspx</uri></author><category term="Community" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/Community/default.aspx" /><category term="XPO" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/XPO/default.aspx" /><category term="XAF" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/XAF/default.aspx" /></entry><entry><title>XAF, XPO and the Squeaky Wheel</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/garyshort/archive/2008/09/16/xaf-xpo-and-the-squeaky-wheel.aspx" /><id>http://community.devexpress.com/blogs/garyshort/archive/2008/09/16/xaf-xpo-and-the-squeaky-wheel.aspx</id><published>2008-09-16T10:45:25Z</published><updated>2008-09-16T10:45:25Z</updated><content type="html">&lt;p&gt;I love my granny, as all of us who are fortunate enough still to have one alive do I’m sure. My granny hails from &lt;a href="http://en.wikipedia.org/wiki/Perthshire"&gt;Highland Perthshire&lt;/a&gt; and is, as we say in Scotland, of farming stock; that is to say that, before retiring, she worked a farm, as her forebearers before her did. This means, amongst other things, that she has a wealth of homespun advise, neatly packaged up into handy little sayings, each one perfect for a particular set of circumstances. For example&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Oh, look at the time and there’s no’ a carrot in the pot!”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Meaning that the day is slipping away and it looks like I might not get through all the tasks I had allocated to do today, and&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Behave yersel’ else I’ll come in aboot yer wa’s wi a tarry stick”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Which means if you do not moderate your bahaviour I’ll beat you about the ribs with the stick I use to stir the molasses for the cattle feed. However, one of my favourites, and one which is somewhat applicable to the situation I now find myself in, is&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“It’s the squeaky wheel that gets the oil”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Meaning it’s the thing (or person) that makes the most noise (or complains loudest) that gets dealt with fastest. I say it is somewhat applicable to the situation that I now find myself in because, whilst taking my habitual morning “stroll” through our forums, I came across a post, in which the writer was praising Mark’s recent set of posts, showing how to write a plugin using DXCore, and wondering aloud why the &lt;a href="http://www.devexpress.com/xaf"&gt;XAF&lt;/a&gt; team couldn’t be more like Mark, and produce such real world examples.&lt;/p&gt;  &lt;p&gt;Of course, if the writer had appreciated that DXCore and XAF/&lt;a href="http://www.devexpress.com/Products/NET/ORM/"&gt;XPO&lt;/a&gt; cannot be compared like for like, he would have been a long way to answering his own question. You see, DXCore is an enabling technology facilitating the creation of a certain type of plugin, it does one thing, and it does it very well and so writing a real world example is easy, as each user’s view of the “world” is the same.&lt;/p&gt;  &lt;p&gt;XAF however, is an application framework, allowing a developer to create winform or webform (or both) applications; it is strategic software that lays out the architectural steps for a developer, the tactical code that the developer then adds to that base, to form the solution to his business problem, is utterly dependent upon a myriad of things:- the industry, the sector of the industry, his company’s view of their market place, financial constraints on his company, financial constraints on his customers, etc, etc, etc; the list goes on and on.&lt;/p&gt;  &lt;p&gt;The point being that there is not one “real world” from which to construct a “real world” example, instead the term takes its definition dependent upon the context of the individual developer. Take me as an example, before joining DevExpress I worked, for 18 years, as a programmer and architect in a number of industries including: Banking, Utilities, FMCG, Pharmaceuticals and Local Government. I can tell you that if you took an application from each of those industries and compared them, they would have little in common. In fact you would have to distil them down to their architectural parts (object persistence, reporting, etc.) before you would find much similarity. So any “real world” example, if it were to be of use to all of our customers equally, can only contain examples of how to use these architectural parts (or product features if you will). It’s no coincidence then, that our MainDemo application demonstrates these product features in a somewhat isolated way, it has to be that way to be of use to our customers as a whole. Again, it is no accident that our documentation takes the same approach of explaining the product features in this way.&lt;/p&gt;  &lt;p&gt;But the “squeaky wheel” says “it’s hard to find information in your documentation”, so I begin a series of cookbook style posts that state a problem, in very simple terms, and then show the solution and a discussion of that solution. The “squeaky wheel” says “these posts are too simplistic” so I suggest a more advanced series, still in the cookbook style, to make it easy to find, called Black Belt XAF and I ask for topic suggestions. The majority of suggestions I receive are not XAF topics but general architectural topics (which I have no objections to covering if that is of benefit to our customers). The “squeaky wheel” says “these examples are not real world”. Although I’ve explained above how it is nearly impossible for us to provide “real world” examples, I decided to start a “Starring You” section in my blog so that actual real world customers can post actual real world examples and they are starting to come through now and yet the post above calls for the XAF team to provide more “real world examples”.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;I contemplated this for a few minutes before I dismissed the idea, I mean how ridiculous. If I were to write a series of blog posts showing how to build a solution from the Banking industry or from the Utilities industry, for example, it would only be useful for a vanishingly small percentage of our customers. Then I thought, wait a minute, maybe this is where I’m going wrong, making assumptions about how useful something would be, why not just ask them? So here we are; the “squeaky wheel” says we need to write a “real world” application and I’m asking you, if I were to create such an application, from start to finish, and even though the chosen industry may have little in common with yours, would that help you? If so, leave a comment below.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:96cf197b-8021-4511-af38-ca5b3eb26b3f" class="wlWriterSmartContent"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/XAF" rel="tag"&gt;XAF&lt;/a&gt;, &lt;a href="http://technorati.com/tags/Community" rel="tag"&gt;Community&lt;/a&gt;&lt;/div&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fcommunity.devexpress.com%2fblogs%2fgaryshort%2farchive%2f2008%2f09%2f16%2fxaf-xpo-and-the-squeaky-wheel.aspx&amp;amp;title=XAF%2c+XPO+and+the+Squeaky+Wheel"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=234881" width="1" height="1"&gt;</content><author><name>Gary Short (Developer Express)</name><uri>http://community.devexpress.com/members/Gary-Short-_2800_Developer-Express_2900_.aspx</uri></author><category term="Community" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/Community/default.aspx" /><category term="XPO" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/XPO/default.aspx" /><category term="XAF" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/XAF/default.aspx" /></entry><entry><title>XAF Cookbook #7 – Add Scrollbars to a TextBox in DetailsView</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/garyshort/archive/2008/09/11/xaf-cookbook-7-add-scrollbars-to-a-textbox-in-detailsview.aspx" /><id>http://community.devexpress.com/blogs/garyshort/archive/2008/09/11/xaf-cookbook-7-add-scrollbars-to-a-textbox-in-detailsview.aspx</id><published>2008-09-11T13:38:03Z</published><updated>2008-09-11T13:38:03Z</updated><content type="html">&lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;You add a text property to a BO, but you require the user to input a number of lines of text, for example in a description field. By default the DetailsView provides a Textbox showing one line of text entry, you wish to show a number of lines of text entry and have scrollbars if required.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Decorate the text property with the [Size(SizeAttribute.Unlimited)] attribute or set the RowCount property to an appropriate value in the ApplicationModel or, via the Model, change the PropertyEditor type to Memo or RichText.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:40f86ea5-dfa8-4438-8c1a-d414ab5097b1" class="wlWriterSmartContent"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/XAF+Cookbook" rel="tag"&gt;XAF Cookbook&lt;/a&gt;&lt;/div&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fcommunity.devexpress.com%2fblogs%2fgaryshort%2farchive%2f2008%2f09%2f11%2fxaf-cookbook-7-add-scrollbars-to-a-textbox-in-detailsview.aspx&amp;amp;title=XAF+Cookbook+%237+%e2%80%93+Add+Scrollbars+to+a+TextBox+in+DetailsView"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=234431" width="1" height="1"&gt;</content><author><name>Gary Short (Developer Express)</name><uri>http://community.devexpress.com/members/Gary-Short-_2800_Developer-Express_2900_.aspx</uri></author><category term="XAF Cookbook" scheme="http://community.devexpress.com/blogs/garyshort/archive/tags/XAF+Cookbook/default.aspx" /></entry></feed>