<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dude, where is my Kaizen? &#187; Composite Apps</title>
	<atom:link href="http://www.bjoernrochel.de/tag/composite-apps/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bjoernrochel.de</link>
	<description>Björn Rochel&#039;s weblog</description>
	<lastBuildDate>Mon, 21 Jun 2010 07:26:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Diving into the StoryTeller trunk, Part 10: Coordination Baby!</title>
		<link>http://www.bjoernrochel.de/2009/11/30/diving-into-the-storyteller-trunk-part-10-coordination-baby/</link>
		<comments>http://www.bjoernrochel.de/2009/11/30/diving-into-the-storyteller-trunk-part-10-coordination-baby/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 08:13:22 +0000</pubDate>
		<dc:creator>BjRo</dc:creator>
				<category><![CDATA[CompositeApps]]></category>
		<category><![CDATA[StoryTeller]]></category>
		<category><![CDATA[Composite Apps]]></category>
		<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://www.bjoernrochel.de/?p=619</guid>
		<description><![CDATA[So far in this series I&#8217;ve talked extensively about what I consider the most of the important parts in the StoryTeller UI design. This includes Screens, the ScreenCollection, ScreenSubject, ScreenFactory, EventAggregation and the application of Convention of Configuration in general.
You could say that we mostly talked about ingredients. Today I would like to take some [...]]]></description>
			<content:encoded><![CDATA[<p>So far in this series I&#8217;ve talked extensively about what I consider the most of the important parts in the StoryTeller UI design. This includes <a href="http://www.bjoernrochel.de/2009/08/14/diving-into-the-storyteller-trunk-part-7-screens/" target="_blank">Screens</a>, <a href="http://www.bjoernrochel.de/2009/08/21/diving-into-the-storyteller-trunk-part-8-the-screencollection/" target="_blank">the ScreenCollection</a>, <a href="http://www.bjoernrochel.de/2009/09/07/diving-into-the-storyteller-trunk-part-9-screensubject-screenfactory/" target="_blank">ScreenSubject</a>, <a href="http://www.bjoernrochel.de/2009/09/07/diving-into-the-storyteller-trunk-part-9-screensubject-screenfactory/" target="_blank">ScreenFactory</a>, <a href="http://www.bjoernrochel.de/2009/07/20/diving-into-the-storyteller-trunk-part-5-the-eventaggregator/" target="_blank">EventAggregation</a> and the application of <a href="http://www.bjoernrochel.de/2009/07/13/diving-into-the-storyteller-trunk-part1-convention-based-registration/" target="_blank">Convention of Configuration</a> in general.</p>
<p>You could say that we mostly talked about ingredients. Today I would like to take some additional time in order to show how this is all assembled into an actual API. Those of you who&#8217;veÂ  already spend some time with the StoryTeller codebase too or have watched one of the many screencasts about the <a href="http://www.jeremydmiller.com/ppatterns/Default.aspx?Page=ScreenActivationLifecycle&amp;AspxAutoDetectCookieSupport=1" target="_blank">Screen Activation Lifecycle</a> probably know what I&#8217;m going to show today. Today is all about the <strong>Screen Conductor</strong>.</p>
<p><strong>Screen Conductor vs. Application Controller</strong></p>
<p>Before we dive into the actual code, let&#8217;s take a short break and talk a little bit about a more high level view on the Screen Conductor and the role the conductor is fulfilling in an application.</p>
<p>Martin Fowler identified the pattern ApplicationController some years ago as <em>&#8220;<a href="http://martinfowler.com/eaaCatalog/applicationController.html">A centralized point for handling screen navigation and the flow of an application.&#8221;</a></em></p>
<p>It&#8217;s kind of a coordination structure which manages / coordinates the lifecylcle of child screens in an application as well as the lifecycle of the application shell itself (think about controlled shutdown for instance).</p>
<p>You can think of the ApplicationController as a Facade client code can call in order to create/activate/deactivate screens in an application. This Facade defines a nice separation between application code on the one side and the UI infrastructure on the other side. It shields away implementation details of how the application is actually displaying screens (tab style, web style, etc) from the client and also provides a nice point for handling scenarios like dirty checks on screens.</p>
<p>As an application grows over time, it&#8217;s a good idea to break down the ApplicationController into several collaborating classes and decouple its implementation details from another in order to make the system more manageable and maintainable. Adding a new screen to the application for instance should not require a change in one of the UI infrastructure classes.</p>
<p>When breaking down the ApplicationController into several collaborating classes a good lead is to use the Single Responsibility Principle in order to identify responsibilities which can be extracted. That&#8217;s exactly what Jeremy D. Miller did in his <a href="http://www.jeremydmiller.com/ppatterns/Default.aspx?Page=ScreenActivationLifecycle&amp;AspxAutoDetectCookieSupport=1" target="_blank">Screen Activation Lifecycle</a>.</p>
<p>He broke down the ApplicationController pattern into several smaller responsibilities, the most important beeing</p>
<ul>
<li>the ScreenCollection (which keeps track of all existing screens and the one beeing the active screen)</li>
<li>the ScreenSubject (which is used to separate identification and creation of a screen from the screen itself)</li>
<li>Screens (which provide the content beeing displayed and hooks for instance for the dirty check when the application closes)</li>
<li>and the ScreenConductor.</li>
</ul>
<p>Jeremy describes the ScreenConductor and its responsibilities as the following:</p>
<p><em>&#8220;Controls the activation and deactivation lifecycle of the screens within the application. Depending on the application, the conductor may be synchronizing the menu state of the shell, attaching views in the main panel or otherwise, and calling hook methods on the Presenter&#8217;s to bootstrap the screen. It may also be just as important to deactivate a screen when it&#8217;s made the inactive tab to stop timers. My first exposure to a Screen Conductor was an insurance application that was built with web style navigation. Anytime the user moved away from a screen we needed to check for &#8220;dirty&#8221; screens to give the user a chance to deal with unsaved work. On the other hand, we also had to check the entry into a requested screen to see if we could really open the screen based on pessimistic locking or permission rules. We pulled our a Layer SuperType for our Presenters for methods like CanLeave() and CanEnter(). The Screen Conductor would use these methods and others to manage screen navigation.&#8221;</em></p>
<p>To me the ScreenConductor is more or less an OCP-fied subset of the original ApplicationController pattern, focussing on the coordination and facade ideas of the original pattern.</p>
<p><strong>A short episode in the Screen Activation Lifecycle</strong></p>
<p>Let&#8217;s give our discussion a bit more detail. So far it was rather abstract. Before looking into the actual code I would like to walk you through a typical usecase which depicts how those components actually work together. The example Jeremy mostly uses for this is &#8220;Opening a source code file in Visual Studio&#8221; . I&#8217;m lazy, so I&#8217;m going to reuse this one.</p>
<p><em>&#8220;Consider you double-click a file in theÂ  Solution Explorer of VS. When you do this for the first time a new tab displaying the contents of the file will be opened. Doing the same thing a second time will not open a new tab, but rather focus the existing tab displaying the contents of the file.&#8221;</em></p>
<p>It&#8217;s actually easy to translate this story into a more abstract version using the responsibilities described in this post so far.</p>
<p><em>&#8220;Consider you want to open a <strong>Screen</strong> via a <strong>ScreenSubject</strong>. When the <strong>ScreenSubject</strong> detects that no related <strong>Screen</strong> is being displayed to the user, a new <strong>Screen </strong>will be created by the subject and then added to the <strong>ScreenCollection</strong>. Doing the same thing a second time will not open up a <strong>Screen</strong>, but rather activate the existing <strong>SCREEN</strong>, because the <strong>ScreenSubject </strong>detected that the <strong>Screen </strong>is already open.&#8221;</em></p>
<p>The interesting sidenode in this design is that from a client code perspective there is no difference between opening up a screen and activating a screen. Really nice . . .</p>
<p><strong>Usecase: Opening a Screen</strong></p>
<p>Now that you&#8217;re familiar with the first scenario, time to show some code. I&#8217;ve shown parts of this before in the previous post (Sorry for the duplication), but added some bits in order to illustrate this example.</p>
<p>From the outside world a call to the ScreenConductor for this usecase might look like this.</p>
<pre class="brush: csharp">

var subject = new CSharpFileSubject(@&quot;C:\end\of\the\world.cs&quot;);
screenConductor.OpenScreen(subject);
</pre>
<p>Notice that all data needed for creating the actual Screen will be passed in with the concrete ScreenSubject implementation.</p>
<pre class="brush: csharp">

public class CSharpFileSubject : IScreenSubject
{
     private _fileName;

     public CSharpFileSubject(string fileName) { _fileName = fileName;}

     public bool Matches(IScreen screen)
     {
          return screen is SourceCodeScreen &amp;&amp;
                    string.Equals((SourceCodeScreen)screen.FileName, _fileName));
     }

     public IScreen CreateScreen(IScreenFactory screenFactory)
     {
          var screen =Â  screenFactory.Build&lt;SourceCodeScreen&gt;();
          screen.File = _fileName;
          return screen;
     }
}
</pre>
<p>This is not quite the code I would write for a real system, but I think you get the point. Two methods need to be implemented for the IScreenSubject interface. This is bool Matches(IScreen) which identifies a related screen and IScreen CreateScreen(IScreenFactory) which is used to create the screens.</p>
<p>I really like this kind of API design since it gives you all sorts of extension points without the need to open up the actual infrastructure. Want to show a WaitCursor while you create the Screen? Go ahead. Want to do some loading before the screen is opened? Here&#8217;s the place to do it . . .</p>
<p>Anyway, the ScreenConductors side of things looks like this.</p>
<pre class="brush: csharp">

        public virtual void  OpenScreen(IScreenSubject subject)
        {
            if (subject.Matches(_screens.Active))
            {
                return;
            }

            IScreen screen = findScreenMatchingSubject(subject);

            if (screen == null)
            {
                screen = createNewActiveScreen(subject);
            }
            else
            {
                activate(screen);
            }

            _screens.Show(screen);
        }
</pre>
<p>Pretty slick, isn&#8217;t it? The whole code is really dense. Most of the methods involved are not more than 5 lines long. Finding the related screen for instance is just a matter of a LINQ-Query on the ScreenCollection using the Matches-method as its predicate.</p>
<pre class="brush: csharp">

private IScreen findScreenMatchingSubject(IScreenSubject subject)
{
      return _screens.AllScreens.FirstOrDefault(subject.Matches);
}
</pre>
<p>Creation of the target screen on the other hand is just a matter of handing the ScreenFactory (which is actually just a facade to the IoC-Container of choice) to the subject, activating the created Screen and adding it to the ScreenCollection.</p>
<pre class="brush: csharp">

private IScreen createNewActiveScreen(IScreenSubject subject)
{
     IScreen screen = subject.CreateScreen(_factory);
     activate(screen);
     _screens.Add(screen);
     return screen;
}
</pre>
<p>The last missing piece here is the actual activation of the Screen.</p>
<pre class="brush: csharp">

private void activate(IScreen screen)
{
    _shellService.ActivateScreen(screen);
}
</pre>
<p>This is delegated to the so called IShellService. You might ask yourself why this particular dependency exists (at least I did). The main purpose of this service is mostly the topic of registering Commands and filling up option panes related to the current Screen. This will be a post on its own, so don&#8217;t be mad at me, when I don&#8217;t cover it today. Instead I would like to take a look at another common use case:</p>
<p><strong>Usecase: Closing a Screen</strong></p>
<p>Now that we&#8217;ve seen how a Screen gets opened, let&#8217;s take a look at the other side of the coin, at how it&#8217;s closed.</p>
<pre class="brush: csharp">
public virtual void Close(IScreen screen)
{
    if (removeScreen(screen))
    {
        activateCurrentScreen();
    }
}
</pre>
<p>Most of the handling is in the removeScreen-method (btw, where does this convention of having all private methods beeing camel-cased come from? Is this some Java-exposure leaking through? <img src='http://www.bjoernrochel.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> )</p>
<pre class="brush: csharp">
private bool removeScreen(IScreen screen)
{
     if (!screen.CanClose()) return false;

    _events.RemoveListener(screen);
    _screens.Remove(screen);

    _shellService.ClearTransient();

    return true;
}
</pre>
<p>It delegates the decision whether a screen can be closed to the screen and in case it can be closed, it removes the screen from the EventAggregator(_events), from the ScreenCollection (_screens) and clears its Command-registration (_shellService.ClearTransient()), before it activates the next screen becoming visible (in case there is one).</p>
<pre class="brush: csharp">

private void activateCurrentScreen()
{
        IScreen screen = _screens.Active;

        if (screen != null)
        {
            activate(screen);
        }
}
</pre>
<p><strong>Usecase: App shutdown coordination</strong></p>
<p>There is another common usecase implemented by the ScreenConductor I would like to show you. This is how the whole app shutdown is coordinated.</p>
<p>Prerequesites for this: Instances interested in beeing notified when the user tries to shut the application down, need to a) implement the <em><strong>IClosable </strong></em>interface and b) be registered at the <strong><em>EventAggregator</em></strong>. The latter is done automatically for Screens by the ScreenConductor.</p>
<pre class="brush: csharp">

public interface ICloseable
{
    void AddCanCloseMessages(CloseToken token);
    void PerformShutdown();
}
</pre>
<p>The IClosable interface just consists of two methods. void AddCanCloseMessage(CloseToken) is called in order to get feedback from listeners whether the application is allowed to be shutdown. You can think of CloseToken as a more or less extended version of CancelEventArgs.</p>
<pre class="brush: csharp">

public class CloseToken
{
     private readonly List&lt;string&gt; _messages = new List&lt;string&gt;();

     public string[] Messages { get { return _messages.ToArray(); } }

     public void AddMessage(string message)
     {
         _messages.Add(message);
     }
}
</pre>
<p>The following code piece is hooked into the Closing &#8211; event of StoryTellers main window (the shell). It heavily leverages the delegate based eventing of StoryTellers EventBroker in order to interact with all interested listeners.</p>
<pre class="brush: csharp">

public bool CanClose()
{
     var token = new CloseToken();

     _events.SendMessage&lt;ICloseable&gt;(x =&gt; x.AddCanCloseMessages(token));

    bool returnValue = true;

    if (token.Messages.Length &gt; 0)
    {
         string userMessage = string.Join(&quot;\n&quot;, token.Messages);
         returnValue = _messageBox.AskUser(CAN_CLOSE_TITLE, userMessage);
    }

    if (returnValue)
    {
        _events.SendMessage&lt;ICloseable&gt;(x =&gt; x.PerformShutdown());
    }

    return returnValue;
}
</pre>
<p>One remark to the CanClose() code: _messageBox is just a small wrapper abstraction in order to make user interaction via message prompts testable. There&#8217;s nothing really fancy behind that.</p>
<p>I really like the way the app shutdown is implemented. In fact we&#8217;ve added something very similar in my current project. However, I&#8217;m not so sure when it comes to the question whether this particular code piece should be part of the ScreenConductor. You could argue that this method has only very limited cohesion with the rest of the ScreenConductors methods. In fact most of the stuff the ScreenConductor interacts with (ScreenCollection, Screens, ScreenFactory, ScreenSubject) isn&#8217;t touched in this method. Besides that, it&#8217;s code that client application code normally IMHO doesn&#8217;t need to or even should call. In our current app we&#8217;ve extracted this responsibillity into a separate class called the ApplicationShutdownCoordinator because of that.</p>
<p><strong>Some more impressions on StoryTellers ScreenConductor</strong></p>
<p>The exposed API of the ScreenConductor is pretty small, actually only 6 &#8220;core&#8221; methods and some overloads.Â  Most of the API really shines. However, besides the already mentioned CanClose() functionality, there is another functionality which in my opinion should not be in the ScreenConductor. Can you spot it?</p>
<p><a href="http://www.bjoernrochel.de/wp-content/uploads/2009/11/screenconductorinterface1.jpg"><img class="aligncenter size-full wp-image-630" src="http://www.bjoernrochel.de/wp-content/uploads/2009/11/screenconductorinterface1.jpg" alt="" width="307" height="232" /></a></p>
<p>LoadHierarchy(Func&lt;Hierarchy&gt;)) looks a bit misplaced to me because it seems to work on a different abstraction level than the rest of the methods. It looks very application specific, while the rest of the StoryTeller APIs look very general purpose (independant from the fact whether Jeremy actually wanted to achieve this or this being just the result of applying good design practices).</p>
<p>Same applies to one of the Messages / Events the ScreenConductor is registered for at the EventBroker, namely DeleteTestMessage. I don&#8217;t think it should be directly handled in the ScreenConductor.</p>
<p><a href="http://www.bjoernrochel.de/wp-content/uploads/2009/11/screenconductorhandlers.jpg"><img class="aligncenter size-full wp-image-629" src="http://www.bjoernrochel.de/wp-content/uploads/2009/11/screenconductorhandlers.jpg" alt="" width="500" height="327" /></a></p>
<p>A static code analysis might indicate that the ScreenConductor has too many dependencies. In fact there&#8217;re</p>
<p>7 direct dependencies injected into the constructor,</p>
<ul>
<li>IEventAggregator</li>
<li>IScreenCollection</li>
<li>IScreenFactory</li>
<li>IApplicationShell</li>
<li>IShellService</li>
<li>IScreenObjectLocator</li>
<li>IMessageCreator</li>
</ul>
<p>6 transient dependencies (method parameters or local scope),</p>
<ul>
<li>IScreen</li>
<li>IScreenSubject</li>
<li>CloseToken</li>
<li>UserScreenActivation</li>
<li>OpenItemMessage</li>
<li>DeleteTestMessage</li>
</ul>
<p>and 3 Message interests</p>
<ul>
<li>UserscreenActivation</li>
<li>OpenItemMessage</li>
<li>DeleteTestMessage</li>
</ul>
<p>in the ScreenConductor class. Sounds pretty heavy and like a refactoring candidate at first. However, as I mentioned earlier, the ScreenConductor is mostly a Facade with some additional coordination logic in it. When I say &#8220;some additional coordination logic&#8221; I mean this literally. <strong>ScreenConductor has just round about 250 LOC</strong>.</p>
<p>I&#8217;m totally ok with this. It certainly has some potential for optimization of the dependencies (IScreenObjectLocator seems to be at least partially obsolete, IApplicationShell and IShellService could be merged I guess), but even without that I consider it a really good example of strong extensible design forÂ  composite desktop apps.</p>
<p>For me personally the ScreenConductor fills a really important gap in the p&amp;p composite app guidance (be it CAB / SCSF or PRISM). I always had the feeling that I&#8217;m missing something there, but was unable to point out exactly what I&#8217;ve been missing. This feeling mostly came up when I added some screen activation or screen creation logic in places that didn&#8217;t felt right. Now I know why. Interestingly others <a href="http://neverindoubtnet.blogspot.com/2009/05/birth-and-death-of-m-v-vm-triads.html" target="_blank">observed the need for something similar as well</a>.</p>
<p>Having a ScreenConductor in your application makes IMHO the whole UI infrastructure a lot more approchable and easier to understand.</p>
<p><strong>Some final thoughts</strong></p>
<p>I left the rest of the ScreenConductors code out of this post intentionally, because if there&#8217;s one thing I&#8217;d like you to take from this post or even the complete series is that StoryTeller is a really good learning resource. I really value, what I&#8217;ve learned from the Dovetail guys while inspecting the code. I wish I had done this earlier.</p>
<p>Good design matters. If you&#8217;re looking for a place to learn more about it, the <a href="http://storyteller.tigris.org/source/browse/storyteller/" target="_blank">StoryTeller codebase</a> might just be the place for you.</p>
<p>See you next time, when we take some time to dig into the command structure of StoryTeller . . .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bjoernrochel.de/2009/11/30/diving-into-the-storyteller-trunk-part-10-coordination-baby/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>What is actually a composite application?</title>
		<link>http://www.bjoernrochel.de/2009/05/04/what-is-actually-a-composite-application/</link>
		<comments>http://www.bjoernrochel.de/2009/05/04/what-is-actually-a-composite-application/#comments</comments>
		<pubDate>Mon, 04 May 2009 21:04:40 +0000</pubDate>
		<dc:creator>BjRo</dc:creator>
				<category><![CDATA[CompositeApps]]></category>
		<category><![CDATA[Composite Apps]]></category>

		<guid isPermaLink="false">http://www.bjoernrochel.de/?p=331</guid>
		<description><![CDATA[&#8216;Composite application&#8217; is one of those terms you talk endlessly with other developers about, only to find out that each of them has a totally different understanding of what the term actually means. If you try to google it you&#8217;ll find several definitions ranging from &#8216;a solution stitched composed of loosely coupled  semi-independent components&#8217; [...]]]></description>
			<content:encoded><![CDATA[<p>&#8216;Composite application&#8217; is one of those terms you talk endlessly with other developers about, only to find out that each of them has a totally different understanding of what the term actually means. If you try to google it you&#8217;ll find several definitions ranging from &#8216;a solution stitched composed of loosely coupled  semi-independent components&#8217; over &#8216;application built by combining multiple existing functions into a new application&#8217; over &#8216;business mashups&#8217; to &#8216;frontends to a Service Oriented Architecture&#8217;.</p>
<p>Just to be clear, I like none of those definitions and I won&#8217;t give you a formal definition either. Instead I would like to take quick look at the key differences (as I see them) between composite applications and conventional architectures.</p>
<p>If take a look at how software developers &amp; architects deal with complexity IMHO it mostly boils down to two things: 1. Decomposition and 2. Integration.  Complex problems get broken down into handier pieces which can be solved more easily. We apply this divide-and-conquer-strategy at multiple levels (classes, algorithms, components, layers, tiers, just to name a few).  We do this to achieve all sort of things like maintainability, reversibility, testability, etc. However, in order to have a working solution you need to reintegrate all those parts and that integration aspect for me personally is one of the main differences between conventional and composite architectures:</p>
<ul>
<li> Integration in conventional architectures is performed in a static way, mainly by the compiler but also by deployment tools (f.e. ILMerge).</li>
<li>Compared to that, integration in composite architectures is more or less dynamic. It&#8217;s performed at runtime by some kind of integration architecture with a kernel built around the concept of dependency inversion. When inspecting composite applications you&#8217;ll very often find a host-process which dynamically loads modules and a container based infrastructure which does the actual low level composition. This container can be an actual Inversion-of-Control-container, but this isn&#8217;t a must. The Managed Extensibility Framework for instance is able to achieve similar things.</li>
</ul>
<p>Besides that, another aspect really important to composite architecture is the <strong>Open-Closed-Principle applied to architecture</strong>. OCP was originally formulated by Uncle Bob Martin as &#8220;<em>software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification</em>&#8220;. What does this mean to architecture? It basically means that you&#8217;re able extend your host environment without having the need to recompile it. This can range from adding a new module to the system, over registering new business capabilities to extending the UI of host environment (which is called the shell).</p>
<p>So far I&#8217;ve talked a bit about the IMHO typical aspects of composite applications, but not why you might want to use such an architecture and what possible benefits of such an architecture might be. I guess this is worth an own post, so I&#8217;ll spare that for now . . . .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bjoernrochel.de/2009/05/04/what-is-actually-a-composite-application/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Composite Apps</title>
		<link>http://www.bjoernrochel.de/2009/03/30/composite-apps/</link>
		<comments>http://www.bjoernrochel.de/2009/03/30/composite-apps/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 20:53:21 +0000</pubDate>
		<dc:creator>BjRo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Composite Apps]]></category>

		<guid isPermaLink="false">http://www.bjoernrochel.de/?p=326</guid>
		<description><![CDATA[I&#8217;m currently in the process of preparing material for a workshop at my current client. The workshop will be  mainly focused on implementing client-side Composite Apps with the Composite UI Application Block / SCSF but it&#8217;ll also contain a large portion about Composite Apps in general.
While the CAB / SCSF is good documented in [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m currently in the process of preparing material for a workshop at my current client. The workshop will be  mainly focused on implementing client-side Composite Apps with the Composite UI Application Block / SCSF but it&#8217;ll also contain a large portion about Composite Apps in general.</p>
<p>While the CAB / SCSF is good documented in several blogs, I&#8217;m not aware of a good overview on the general part of Composite Apps, especially when it comes to typical pitfalls of such architectures and how to avoid them.</p>
<p>I believe that a lot of the problems related to such architectures are reoccuring (like patterns).  At least I&#8217;ve seen them on the last three apps I worked on. Bottomline: I thought it might be a good idea to share my current view on the topic and discuss it in further posts.</p>
<p>Stuff I&#8217;m planing to cover:</p>
<ul>
<li><a href="http://www.bjoernrochel.de/2009/05/04/what-is-actually-a-composite-application/" target="_blank">What is actually a Composite App?</a></li>
<li>When should you invest in a composite architecture?</li>
<li>Typical pitfall: Assembly explosion</li>
<li>Typical pitfall: The composite monolith aka broken module autonomy<br />
(This will probably be more than just one post)</li>
<li>Typical pitfall: Nontransparent remote calls</li>
<li>Typical pitfall: Synchronous communication</li>
</ul>
<p>The index of content is work in progress and I don&#8217;t consider it to be complete. Feel free to post any suggestions and feedback . . .</p>
<p>Stay tuned for more !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bjoernrochel.de/2009/03/30/composite-apps/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
