Welcome!

Microsoft Cloud Authors: Pat Romanski, Lori MacVittie, Andreas Grabner, Jim Kaskade, John Basso

Related Topics: Microsoft Cloud

Microsoft Cloud: Article

Dependency Injection and Microsoft Windows Forms

A walkthrough using Microsoft's Composite UI Application Block

The patterns & practices group at Microsoft provides architectural and design guidance for users of Microsoft technologies. Part of the way they do this is by producing and distributing packages called "application blocks." An application block consists of a functional subsystem or software framework that can be valuable in several ways. Application blocks can be implemented in many types of applications as time-saving subsystems. They are also reference examples of software designed and developed using the best practices of Microsoft architecture. Application blocks are freely distributed with all source code and documentation.

The Composite User Interface Application Block
The Composite UI Application Block (called "CAB" in the online community) is the first application block that has been developed exclusively for .NET 2.0. It is an architectural framework that is designed to help developers quickly implement loosely coupled Windows Forms applications. It employs a number of industry standard design patterns, including Model/View/Controller, Inversion of Control/Dependency Injection, and Publish/Subscribe.

Dependency Injection is a design pattern that was originally developed in the Java community. The basic idea of Dependency Injection is to design software that consists of a number of highly cohesive modules that have predefined interfaces, and to determine the details of how the objects interact with one another at run time. A great in-depth article on Dependency Injection by Martin Fowler can be found at www.martinfowler.com/articles/injection.html.

The goal of this article is to provide a straightforward introduction to CAB that focuses on its implementation of Dependency Injection. It will do this by providing step-by-step instructions for the construction of a simple Windows Forms application.

The demo application that will be built is a very simple master/detail data viewer. The interface will consist of two list boxes. The list box on the left side of the form will display a set of categories. Clicking on one of the items in this list box will cause line items in that category to be displayed in the list box on the right. The sample data we will use will be a set of shopping lists stored in an XML file.

CAB Installation and Prerequisites
The CAB installation package can be downloaded from the Microsoft patterns & practices Web site. In order to install CAB, you must have the .NET 2.0 Framework installed on the development machine. This walkthrough assumes that you will be using Visual Studio 2005 and C# for development.

Create the Shell Application
Open Visual Studio 2005 and create a new project of type "Windows Application." Name the project "DataViewerShell" and change the name of the solution to "ListManager."

Before starting to code we need to bring the CAB assemblies into the solution. You can add references to the compiled assemblies directly, if you have already built CAB, or you can just include the projects in your solution. The CAB assemblies that are used for this walkthrough are: "CompositeUI," "CompositeUI.Utility," "CompositeUI.WinForms," and "ObjectBuilder."

After you have included the CAB assemblies, the first step is to create the shell form. Right-click on the project and add a new Windows Form. Name it "ShellForm.cs." To fulfill the requirements of our sample application, we will need two list boxes to show up on this form: one for the master data on the left and one for the details on the right. Using CAB however, the only thing we will do in the shell is to create placeholders (called "Workspaces") where the controls will reside.

A workspace is a type of control that is included in CAB. If you want to use the designer to add workspaces to the shell form, you may want to load them into the toolbox. Bring up the toolbox if it is hidden or closed, scroll to the bottom, right-click in the "General" section, and select "Choose Items." In the "Choose Toolbox Items" dialog, click on "Browse" and navigate to the location of the "Microsoft.Practices.CompositeUI.WinForms.dll" assembly. Click on this assembly and click "OK," and the CAB workspace controls should load up into your toolbox.

For this example, the type of Workspace we will use will be a DeckWorkspace. This type allows stacking of multiple controls in the same place, like a deck of cards, only displaying the one on top. Drag two DeckWorkspace controls onto the shell form and arrange them as shown in Figure 1. Name the workspace on the left "navigationWorkspace," and the one on the right "viewerWorkspace."

The only actual coding we need to do in the shell is to create the application itself. Add a new class to the project and name it "ShellApplication.cs." This class will define the application object that launches and hosts the shell form. The only thing you need to do to wire this application up for CAB is to have it inherit from "Microsoft.Practices.CompositeUI.WinForms.FormShellApplicaiton<TWorkItem, TShell>."

The type declaration for FormShellApplication<TWorkItem, TShell> takes in two types. TWorkItem is the type of the default WorkItem, which is a basic container class in CAB. The default WorkItem for this shell doesn't need to have any special code in it, as it just acts as an overall container, so we can pass the type "WorkItem," which is the base class. TShell represents the type of the shell form. For TShell, we will specify the type of the shell form that we just created, "ShellForm."

The final step is to add the default static void Main() method to launch an instance of the application. Listing 1 shows the code for the complete ShellApplication class. The base FormShellApplication class does all of the work for us upon initialization: it creates an instance of the default work item and launches an instance of the ShellForm.

The application should build and run at this point. Check in the properties of DataViewerShell that the output type is "Windows Application," then compile and launch the application in the debugger. You should see a blank ShellForm like the one shown in Figure 2.

Create the First Module
CAB provides base container classes called "Modules," which represent sets of related controls and functionality. Using Dependency Injection, modules can be plugged into a shell at run time. CAB user controls are called "SmartParts," since they are context-aware controls that participate in Dependency Injection. The first module we will create for the demo application will be the one that will house the ListBox on the left side of our shell.

Add a new project of type "Class Library" to your solution and name it "ListOrganizerModule." Add references to the four CAB assemblies, but not to the shell application project. The List Organizer module needs three classes in it; one for the user control that holds the ListBox, a WorkItem class to act as a container for injection into the shell, and a class that inherits from the ModuleInit class to house initialization code for the module.

First, create a new User Control and name it "ListOrganizerListBox." In the Visual Studio Designer, drag a ListBox control onto the user control and name it "listBoxLists." This user control will be inserted into the navigationWorkspace on the shell form. Resize the control so that it is approximately the size of the navigationWorkspace.

Next, create the WorkItem. Add a new class to the project, and name it "ListOrganizerWorkItem." Modify the class declaration so that it inherits from Microsoft.Practices.CompositeUI.WorkItem. All we need to do in this class is to write an overload of the "Run" method that takes in the workspace where we want the control to show up. The code for this is shown in Listing 2.

The overload of the "Run" method takes in a parameter of type IWorkspace. It calls the "Show" method on the IWorkspace, passing in a new instance of the ListOrganizerListBox user control. The new instance is created by calling the AddNew<TType> generic factory method on the WorkItem's "Items" property. This method creates an instance of the specified type, injects it into the WorkItem, and returns a reference to it.

Finally, we need to create the ModuleInit class (see Listing 3). This class is the default implementation of IModule, which is the interface that defines a module. Add a new class to the project and name it "ListOrganizerInit.cs." Modify the class declaration so that it inherits from Microsoft.Practices.CompositeUI.ModuleInit.

Add a private member and public property for the parent work item. Mark the property with the "ServiceDependency" attribute - doing this will cause CAB to automatically initialize the value when the application starts.

Override the Load method of the ModuleInit class to load our module into the shell. This override does three things. First, it calls the Load method on the base class. Second, it creates an instance of the ListOrganizerWorkItem class using the generic factory method on the parent work item's collection of work items. Finally, it calls the overload of "Run" on the ListOrganizerWorkItem that we created in that class, which loads our user control into the correct workspace on the shell form.

More Stories By Guy Starbuck

Guy Starbuck is a senior application architect for Stericycle, Inc. He has been working in the software industry for over nine years. Guy lives in Arlington Heights, IL with his wife and son.

Comments (6) View Comments

Share your thoughts on this story.

Add your comment
You must be signed in to add a comment. Sign-in | Register

In accordance with our Comment Policy, we encourage comments that are on topic, relevant and to-the-point. We will remove comments that include profanity, personal attacks, racial slurs, threats of violence, or other inappropriate material that violates our Terms and Conditions, and will block users who make repeated violations. We ask all readers to expect diversity of opinion and to treat one another with dignity and respect.


Most Recent Comments
Assen Bogdanov 03/03/06 11:07:47 AM EST

Hi,
I read and implemented the Dependency Injection article and it works beautifully!
I have a question. How does one link the various tab pages as opposed to just the first one? By providing just the control name, e.g. WorkItem.Workspaces["tabWorkspace"], everything always goes to the first TabPage. What would be the way to control which TabPage gets the link?

Thank you

Regards

Assen Bogdanov

realworldsa.dotnetdevelopersjournal.com 01/05/06 09:56:18 AM EST

Trackback Added: Dependency Injection, Generics, Enterprise Library 2.0, Composit; The Composite UI Application Block and the Enterprise Library 2.0 use Generics extensively and introduce dependency injection through the P&P ObjectBuilder framework.If you plan on using the Composite UI Application Block or the Enterprise Library 2.

SYS-CON Brazil News Desk 12/20/05 05:33:10 PM EST

Dependency Injection and Microsoft Windows Forms. The patterns & practices group at Microsoft provides architectural and design guidance for users of Microsoft technologies. Part of the way they do this is by producing and distributing packages called 'application blocks.' An application block consists of a functional subsystem or software framework that can be valuable in several ways. Application blocks can be implemented in many types of applications as time-saving subsystems. They are also reference examples of software designed and developed using the best practices of Microsoft architecture. Application blocks are freely distributed with all source code and documentation.

SYS-CON Belgium News Desk 12/20/05 03:42:56 PM EST

The patterns & practices group at Microsoft provides architectural and design guidance for users of Microsoft technologies. Part of the way they do this is by producing and distributing packages called 'application blocks.' An application block consists of a functional subsystem or software framework that can be valuable in several ways. Application blocks can be implemented in many types of applications as time-saving subsystems. They are also reference examples of software designed and developed using the best practices of Microsoft architecture. Application blocks are freely distributed with all source code and documentation.

SYS-CON Germany News Desk 12/20/05 03:11:31 PM EST

Dependency Injection and Microsoft Windows Forms
The patterns & practices group at Microsoft provides architectural and design guidance for users of Microsoft technologies. Part of the way they do this is by producing and distributing packages called 'application blocks.' An application block consists of a functional subsystem or software framework that can be valuable in several ways. Application blocks can be implemented in many types of applications as time-saving subsystems. They are also reference examples of software designed and developed using the best practices of Microsoft architecture. Application blocks are freely distributed with all source code and documentation.

.NET News Desk 12/20/05 02:25:27 PM EST

Dependency Injection and Microsoft Windows Forms. The patterns & practices group at Microsoft provides architectural and design guidance for users of Microsoft technologies. Part of the way they do this is by producing and distributing packages called 'application blocks.' An application block consists of a functional subsystem or software framework that can be valuable in several ways. Application blocks can be implemented in many types of applications as time-saving subsystems. They are also reference examples of software designed and developed using the best practices of Microsoft architecture. Application blocks are freely distributed with all source code and documentation.

@ThingsExpo Stories
IoT solutions exploit operational data generated by Internet-connected smart “things” for the purpose of gaining operational insight and producing “better outcomes” (for example, create new business models, eliminate unscheduled maintenance, etc.). The explosive proliferation of IoT solutions will result in an exponential growth in the volume of IoT data, precipitating significant Information Governance issues: who owns the IoT data, what are the rights/duties of IoT solutions adopters towards t...
WebRTC is the future of browser-to-browser communications, and continues to make inroads into the traditional, difficult, plug-in web communications world. The 6th WebRTC Summit continues our tradition of delivering the latest and greatest presentations within the world of WebRTC. Topics include voice calling, video chat, P2P file sharing, and use cases that have already leveraged the power and convenience of WebRTC.
Unsecured IoT devices were used to launch crippling DDOS attacks in October 2016, targeting services such as Twitter, Spotify, and GitHub. Subsequent testimony to Congress about potential attacks on office buildings, schools, and hospitals raised the possibility for the IoT to harm and even kill people. What should be done? Does the government need to intervene? This panel at @ThingExpo New York brings together leading IoT and security experts to discuss this very serious topic.
In his keynote at 18th Cloud Expo, Andrew Keys, Co-Founder of ConsenSys Enterprise, provided an overview of the evolution of the Internet and the Database and the future of their combination – the Blockchain. Andrew Keys is Co-Founder of ConsenSys Enterprise. He comes to ConsenSys Enterprise with capital markets, technology and entrepreneurial experience. Previously, he worked for UBS investment bank in equities analysis. Later, he was responsible for the creation and distribution of life sett...
20th Cloud Expo, taking place June 6-8, 2017, at the Javits Center in New York City, NY, will feature technical sessions from a rock star conference faculty and the leading industry players in the world. Cloud computing is now being embraced by a majority of enterprises of all sizes. Yesterday's debate about public vs. private has transformed into the reality of hybrid cloud: a recent survey shows that 74% of enterprises have a hybrid cloud strategy.
Whether your IoT service is connecting cars, homes, appliances, wearable, cameras or other devices, one question hangs in the balance – how do you actually make money from this service? The ability to turn your IoT service into profit requires the ability to create a monetization strategy that is flexible, scalable and working for you in real-time. It must be a transparent, smoothly implemented strategy that all stakeholders – from customers to the board – will be able to understand and comprehe...
An IoT product’s log files speak volumes about what’s happening with your products in the field, pinpointing current and potential issues, and enabling you to predict failures and save millions of dollars in inventory. But until recently, no one knew how to listen. In his session at @ThingsExpo, Dan Gettens, Chief Research Officer at OnProcess, discussed recent research by Massachusetts Institute of Technology and OnProcess Technology, where MIT created a new, breakthrough analytics model for ...
DevOps is being widely accepted (if not fully adopted) as essential in enterprise IT. But as Enterprise DevOps gains maturity, expands scope, and increases velocity, the need for data-driven decisions across teams becomes more acute. DevOps teams in any modern business must wrangle the ‘digital exhaust’ from the delivery toolchain, "pervasive" and "cognitive" computing, APIs and services, mobile devices and applications, the Internet of Things, and now even blockchain. In this power panel at @...
More and more brands have jumped on the IoT bandwagon. We have an excess of wearables – activity trackers, smartwatches, smart glasses and sneakers, and more that track seemingly endless datapoints. However, most consumers have no idea what “IoT” means. Creating more wearables that track data shouldn't be the aim of brands; delivering meaningful, tangible relevance to their users should be. We're in a period in which the IoT pendulum is still swinging. Initially, it swung toward "smart for smar...
With major technology companies and startups seriously embracing IoT strategies, now is the perfect time to attend @ThingsExpo 2016 in New York. Learn what is going on, contribute to the discussions, and ensure that your enterprise is as "IoT-Ready" as it can be! Internet of @ThingsExpo, taking place June 6-8, 2017, at the Javits Center in New York City, New York, is co-located with 20th Cloud Expo and will feature technical sessions from a rock star conference faculty and the leading industry p...
"We build IoT infrastructure products - when you have to integrate different devices, different systems and cloud you have to build an application to do that but we eliminate the need to build an application. Our products can integrate any device, any system, any cloud regardless of protocol," explained Peter Jung, Chief Product Officer at Pulzze Systems, in this SYS-CON.tv interview at @ThingsExpo, held November 1-3, 2016, at the Santa Clara Convention Center in Santa Clara, CA.
Internet of @ThingsExpo has announced today that Chris Matthieu has been named tech chair of Internet of @ThingsExpo 2017 New York The 7th Internet of @ThingsExpo will take place on June 6-8, 2017, at the Javits Center in New York City, New York. Chris Matthieu is the co-founder and CTO of Octoblu, a revolutionary real-time IoT platform recently acquired by Citrix. Octoblu connects things, systems, people and clouds to a global mesh network allowing users to automate and control design flo...
In addition to all the benefits, IoT is also bringing new kind of customer experience challenges - cars that unlock themselves, thermostats turning houses into saunas and baby video monitors broadcasting over the internet. This list can only increase because while IoT services should be intuitive and simple to use, the delivery ecosystem is a myriad of potential problems as IoT explodes complexity. So finding a performance issue is like finding the proverbial needle in the haystack.
Data is the fuel that drives the machine learning algorithmic engines and ultimately provides the business value. In his session at 20th Cloud Expo, Ed Featherston, director/senior enterprise architect at Collaborative Consulting, will discuss the key considerations around quality, volume, timeliness, and pedigree that must be dealt with in order to properly fuel that engine.
According to Forrester Research, every business will become either a digital predator or digital prey by 2020. To avoid demise, organizations must rapidly create new sources of value in their end-to-end customer experiences. True digital predators also must break down information and process silos and extend digital transformation initiatives to empower employees with the digital resources needed to win, serve, and retain customers.
The WebRTC Summit New York, to be held June 6-8, 2017, at the Javits Center in New York City, NY, announces that its Call for Papers is now open. Topics include all aspects of improving IT delivery by eliminating waste through automated business models leveraging cloud technologies. WebRTC Summit is co-located with 20th International Cloud Expo and @ThingsExpo. WebRTC is the future of browser-to-browser communications, and continues to make inroads into the traditional, difficult, plug-in web co...
In his general session at 19th Cloud Expo, Manish Dixit, VP of Product and Engineering at Dice, discussed how Dice leverages data insights and tools to help both tech professionals and recruiters better understand how skills relate to each other and which skills are in high demand using interactive visualizations and salary indicator tools to maximize earning potential. Manish Dixit is VP of Product and Engineering at Dice. As the leader of the Product, Engineering and Data Sciences team at D...
The Internet of Things (IoT) promises to simplify and streamline our lives by automating routine tasks that distract us from our goals. This promise is based on the ubiquitous deployment of smart, connected devices that link everything from industrial control systems to automobiles to refrigerators. Unfortunately, comparatively few of the devices currently deployed have been developed with an eye toward security, and as the DDoS attacks of late October 2016 have demonstrated, this oversight can ...
What happens when the different parts of a vehicle become smarter than the vehicle itself? As we move toward the era of smart everything, hundreds of entities in a vehicle that communicate with each other, the vehicle and external systems create a need for identity orchestration so that all entities work as a conglomerate. Much like an orchestra without a conductor, without the ability to secure, control, and connect the link between a vehicle’s head unit, devices, and systems and to manage the ...
"Once customers get a year into their IoT deployments, they start to realize that they may have been shortsighted in the ways they built out their deployment and the key thing I see a lot of people looking at is - how can I take equipment data, pull it back in an IoT solution and show it in a dashboard," stated Dave McCarthy, Director of Products at Bsquare Corporation, in this SYS-CON.tv interview at @ThingsExpo, held November 1-3, 2016, at the Santa Clara Convention Center in Santa Clara, CA.