Wednesday, September 10, 2008

Sony Ericsson announces today that the Windows Mobile-phone Xperia X1 is launched on September the 30th. It will be available in stores on October the 10th Aaccording to It24.

The company's marketing is focused around Johnny X: "Johnny X is about a young man with amnesia desperately piecing together his identity. The webisodic thriller comprises of nine episodes, created to demonstrate the rich, immersive and experiential elements of the Xperia™ X1. "

Check it out here: www.whoisjohnny-x.com!

posted on Wednesday, September 10, 2008 9:50:35 AM UTC  by Andy  #    Comments [0]
 Monday, August 04, 2008

After four weeks of relaxing vacation, I am now back in business. Events around the iPhone have dominated the mobility market the last four weeks.

The most interesting aspect of what's going on is how Apple has managed to cut the operator from the device upgrade och application distribution processes. Microsoft entered the market a few years ago and let the mobile operators define their own processes. This has resulted in a broken experience for all Windows Mobile users. Apple has shown that it is possible to take responsibility of an end-to-end experience.

I wonder if Microsoft will stick with its strategy and seek process cooperation with operators or if the company will try to follow Apple's lead.

posted on Monday, August 04, 2008 7:39:10 AM UTC  by Andy  #    Comments [0]
 Wednesday, May 28, 2008

blueprintuiThis is the final post in this series, and for a complete reference, here are the previous parts:

  • Part 1 was a general introduction
  • Part 2 talked about the changes in the lower tiers (logic + data, LINQ2SQL)
  • Part 3 discussed the changes in communication (WCF)
  • Part 4 covered important stuff in the user interface (MVC)
  • Part 5 summarized the theory and outlined the new architecture
  • Part 6 started the walkthrough of the architecture code by looking at the business domain
  • Part 7 continued the code walkthrough with a look at the service (WCF)
  • Part 8 covered the consumption of the service with .NET CF
  • Part 9 showed the implementation of the user interface (MVC)

The implemented architecture is published on CodePlex in a project called Windows Mobile Architecture Blueprint, and this means that you can access the full source code as well as discuss it, come with suggested improvements, etc.

On the upper right you see the UX of the sample client included in the architecture blueprint, and the functionality is that the combo box is filled with the categories when the application starts. Then, when a category is selected, the product names are shown in the text box below.

Even if this series is complete, we will continue to build further on this architecture blueprint, and any suggestions on things to add are most welcome. Any other feedback, for that matter, is also welcome!

posted on Wednesday, May 28, 2008 6:31:06 AM UTC  by Chris  #    Comments [0]
 Monday, May 26, 2008

It was not easy trying to spot a Windows Mobile-phone on a public spot a couple of years ago. Not so anymore. When I'm out travelling I see Windows Mobile-phones more and more often, both among business users and consumers. The latest issue of the magazine "M3 Digital World" includes a test of eight GPS enabled mobile phones. Five of the eight phones are Windows Mobile-phones.

The reviewer gives the E-TENs Glofiish X800 a thumbs up! Check out engagdet's review of the unit here…

We'll see more and more Windows Mobile-phones out on the streets.


Image: engadget.com

posted on Monday, May 26, 2008 8:14:47 AM UTC  by Andy  #    Comments [0]
 Friday, May 23, 2008

WeI will continue the more practical part of this series by showing how the new mobile architecture looks in code, and if you want some background, please see the previous parts:

  • Part 1 was a general introduction
  • Part 2 talked about the changes in the lower tiers (logic + data, LINQ2SQL)
  • Part 3 discussed the changes in communication (WCF)
  • Part 4 covered important stuff in the user interface (MVC)
  • Part 5 summarized the theory and outlined the new architecture
  • Part 6 started the walkthrough of the architecture code by looking at the business domain
  • Part 7 continued the code walkthrough with a look at the service (WCF)
  • Part 8 covered the consumption of the service with .NET CF

The implemented architecture is published on CodePlex in a project called Windows Mobile Architecture Blueprint, and this means that you can access the full source code as well as discuss it, come with suggested improvements, etc. As I walk you through the creation of the architecture, we suggest you keep the source code handy to check out more details.

It's time to look at how we can implement the MVC pattern in the Windows Mobile client project that we created in the previous part of this series. As we've touched on before in this series, we have built this part of the architecture on a very simple and straightforward implementation by Alex Yakhnin, that he published as a small blog series last fall (see part 1 and part 2).

As Alex, I started with the core interfaces...

interface IView
{
   
void Show();
   
void Hide();
   
void Close();
   
string Text { get; set; }
}
interface IController
{
   
IView View { get; set; }
}

...and then the interface for the main view (form)...

interface IMainView : IView
{
   
Category SelectedCategory { get; }

   
void SetCategories(Category[] categories);
   
void SetProducts(string products);

   
event EventHandler Done;
   
event EventHandler CategorySelected;
}

...which already tells us what the main form can do. It allows us to set a number of categories (to choose from, SetCategories) and it will notify when a category is selected (CategorySelected). It will also make that selected category available through a public property (SelectedCategory) and allow us to set the products for a (the selected) category (SetProducts). Finally, it will notify when the user is done with it (Done).

The implementation of the controller for the main form looks like this...

class MainController : IController
{
   
private IMainView view;
   
private ServiceClient service;

   
public MainController(IMainView view)
    {
        View = view;

       
ServiceClient.EndpointAddress = new EndpointAddress("http://192.168.0.100:5610/Service.svc/basic");
        service =
new ServiceClient();

       
Category[] categories = service.GetCategories();
        view.SetCategories(categories);
    }

   
private void attachView(IMainView view)
    {
       
this.view = view;
        view.CategorySelected +=
new EventHandler(view_CategorySelected);
        view.Done +=
new EventHandler(view_Done);
    }

   
void view_CategorySelected(object sender, EventArgs e)
    {
        Category category = view.SelectedCategory;
       
string s = string.Empty;
       
foreach(Product product in category.Products)
            s += product.ProductName +
"\r\n";
        view.SetProducts(s);
    }

   
void view_Done(object sender, EventArgs e)
    {
        Application.Exit();
    }

    #region IController Members
   
public IView View
    {
       
get { return view; }
       
set { attachView(value as IMainView); }
    }
    #endregion
}

..and upon creation, the controller saves its view, and set up the event handlers to capture event from the view. Then it make the first call to the service to get the category list which is sent to the view. When a category is selected, a string is created (I know, in a real solution it would be a StringBuilder, but this code is simpler to read) and passed to the view.

The implementation of the main view (form) looks like this...

public partial class MainForm : Form, IMainView
{
    public MainForm()
    {
        InitializeComponent();
    }

    public Category SelectedCategory
    {
       
get { return categoryComboBox.SelectedItem as Category; }
    }

    public void SetCategories(Category[] categories)
    {
       
foreach(Category category in categories)
            categoryComboBox.Items.Add(category);
    }

   
public void SetProducts(string products)
    {
        productsTextBox.Text = products;
    }

    public event EventHandler CategorySelected;
   
private void categoryComboBox_SelectedIndexChanged(object sender, EventArgs e)
    {
       
if(CategorySelected != null)
            CategorySelected(
this, null);
    }

   
public event EventHandler Done;
   
private void doneMenuItem_Click(object sender, EventArgs e)
    {
       
if(Done != null)
            Done(
this, null);
    }
}

...and here we see that the categories are loaded in a combo box which is used to determine the currently selected category, and also to raise the event when a category is selected. The products string is simply put into a text box, and a menu option is used to offer the user to exit.

To manage (can cache) the various controllers and views, we use the following singleton class...

class ApplicationManager
{
   
public static readonly ApplicationManager Instance = new ApplicationManager();
   
private ApplicationManager() { }

   
private Dictionary<string, IController> controllersCache;

   
public MainForm GetMainForm()
    {
       
if(!controllersCache.ContainsKey("Main"))
            controllersCache.Add(
"Main", new MainController(new MainForm()));
       
return controllersCache["Main"].View as MainForm;
    }
}

...and the application is kicked off like this...

[MTAThread]
static void Main()
{
   
Application.Run(ApplicationManager.Instance.GetMainForm());
}

...which concludes the walkthrough of the basic architectore! In the next post, we will summarize this series of blog posts on the architecture blueprint implementation.

posted on Friday, May 23, 2008 10:28:58 AM UTC  by Chris  #    Comments [0]
 Thursday, May 22, 2008

This article came in very handy in our project!

"Creating controls for .NET Compact Framework–based applications—which include transparency, gradients, and three-dimensional glass-like appearance—is well within reach today, using existing Microsoft Windows Mobile development tools. This article will demonstrate how to achieve transparency, gradients, and glass effects by extending existing .NET Compact Framework controls and leveraging some powerful native graphics features available in the Windows Mobile operating system."

Read it here...

posted on Thursday, May 22, 2008 7:27:07 AM UTC  by Andy  #    Comments [0]
 Wednesday, May 21, 2008

My latest column was published in Computer Sweden today. You can read it here…

In the column I write about a field trip with some biologists. We had designed a Windows Mobile-application that they used when stock taking meadows and pasture lands. During the field trip I analyzed how the solution worked in reality… and I had the privilige of learning a lot about the landscape.

The most inspiring thing was when one of the biologists "read" the landscape and could foretell what butterfly we would likely to find at a particular place. He was right. See my pictures from the event below!

When I look into the IT-landscape today I see mobile device management (Sybase OneBridge, Microsoft Mobile Device Manager and The Institution), Web 2.0 (Sharepoint, Confluence, Incentive from Mindroute), and development tools that melt together with designer tools (Flash, Silverlight).

But the most beautiful creature out there? It's the butterfly!

 

 

 

posted on Wednesday, May 21, 2008 10:04:50 AM UTC  by Andy  #    Comments [0]
 Friday, May 16, 2008

We will continue the more practical part of this series by showing how the new mobile architecture looks in code, and if you want some background, please see the previous parts:

  • Part 1 was a general introduction
  • Part 2 talked about the changes in the lower tiers (logic + data, LINQ2SQL)
  • Part 3 discussed the changes in communication (WCF)
  • Part 4 covered important stuff in the user interface (MVC)
  • Part 5 summarized the theory and outlined the new architecture
  • Part 6 started the walkthrough of the architecture code by looking at the business domain
  • Part 7 continued the code walkthrough with a look at the service (WCF)

The implemented architecture is published on CodePlex in a project called Windows Mobile Architecture Blueprint, and this means that you can access the full source code as well as discuss it, come with suggested improvements, etc. As I walk you through the creation of the architecture, we suggest you keep the source code handy to check out more details.

We are now ready to consume the WCF service that we created in the previous post, and therefore we have added a new "Smart Device Project" and selected to create a Device application targeting Windows Mobile 6 Standard (a.k.a Smartphone) and the latest .NET Compact Framework (3.5).

As the tools support is not yet in place in Visual Studio, to consume a WCF service, you need to first download and install the Power Toys for .NET Compact Framework 3.5. The tool that you are after is named NetCFSvcUtil.exe, and you use it like this...

NetCFSvcUtil /language:cs http://localhost:5610/Service.svc

...and in the source code you can find a batch file (CreateServiceClient.bat) that will run this command (note that you may have to change the path to the NetCFSvcUtil utility depending on whether you're running on 32- or 64-bit). Note that the WCF service must be running when you run this command, and the out of running this batch file looks something like this...

netcfsvcutl

...with the result that two files are generated (Service.cs and CFClientBase.cs). As there files are already part of the source code, they will simply be replaced and the procedure with running the batch file is the next best thing to what you would expect from integrated support in Visual Studio.

Now, with these two files in place, we can start consuming the WCF service with code like this...

ServiceClient.EndpointAddress = new EndpointAddress("http://192.168.0.100:5610/Service.svc/basic");
ServiceClient service = new ServiceClient();
Category[] categories = service.GetCategories();

...and the first thing we do is to set an endpoint of the service that the mobile device can reach (in this case an IP address). Then the service proxy (ServiceClient) is instantiated and used to retrieve the list of categories. Note that the business entity (Category) that was declared back in the business domain (automatically generated by LINQ2SQL, and automatically serialized by WCF) is readily available on the mobile client (thanks to the proxy we generated above).

In future posts, we will cover more parts of the architecture blueprint implementation.

In some projects, we have used a very simple and straightforward implementation by our former fellow MVP, Alex Yakhnin (he's now employed by Microsoft), that he published as a small blog series last fall (see part 1 and part 2).

posted on Friday, May 16, 2008 10:28:31 AM UTC  by Chris  #    Comments [0]
 Friday, May 09, 2008

WeI will continue the more practical part of this series by showing how the new mobile architecture looks in code, and if you want some background, please see the previous parts:

  • Part 1 was a general introduction
  • Part 2 talked about the changes in the lower tiers (logic + data, LINQ2SQL)
  • Part 3 discussed the changes in communication (WCF)
  • Part 4 covered important stuff in the user interface (MVC)
  • Part 5 summarized the theory and outlined the new architecture
  • Part 6 started the walkthrough of the architecture code by looking at the business domain

The implemented architecture is published on CodePlex in a project called Windows Mobile Architecture Blueprint, and this means that you can access the full source code as well as discuss it, come with suggested improvements, etc. As I walk you through the creation of the architecture, we suggest you keep the source code handy to check out more details.

The next step in building the architecture is to create the service interface (i.e. the service), and therefore we have added a new "WCF Service Application" project called Blueprint.Facade to the solution that already included the business domain project (Blueprint.Domain). Our first service will be publishing the very simple functionality that the business domain provides (the ability to retrieve all categories from the database). First, we have renamed the service interface to IService and the service implementation to Service (removed the "1" at the end on both), and here you need to make sure that all references are updated (four occurences in the web.config file and don't forget the one in Service.svc). The implementation of the service interface (IService.cs) can be done like this...

[ServiceContract]
public interface IService
{
    [
OperationContract]
   
Category[] GetCategories();
}

...and with a reference to the business domain project, the service implementation (Service.svc.cs) can be implemented with this code...

public class Service : IService
{
   
public Category[] GetCategories()
    {
       
using(NorthwindDataContext dc = new NorthwindDataContext())
           
return dc.GetCategories();
    }
}

...to complete the implementation of the service. When the project is built and run, the WCF is ready to be consumed, and therefore it's a good idea to remember the URL to the service as we will need it in the next post when we will look at how this service can be consumed from a mobile client application.

posted on Friday, May 09, 2008 10:27:52 AM UTC  by Andy  #    Comments [0]
 Wednesday, May 07, 2008

I am migrating a .NET CF 2-application to .NET CF 3.5. We haven't come across any breaking changes in our project. In fact, we've just seen benefits from the upgrade (ie performance). However, if you are about to do the same thing, don't miss the article: .NET Compact Framework 3.5 Run-Time Breaking Changes...

posted on Wednesday, May 07, 2008 7:27:28 AM UTC  by Andy  #    Comments [0]
 Friday, May 02, 2008

In this part, we will get more practical by showing how the first parts of this new mobile architecture looks in code, and if you want some background, please see the previous parts:

  • Part 1 was a general introduction
  • Part 2 talked about the changes in the lower tiers (logic + data, LINQ2SQL)
  • Part 3 discussed the changes in communication (WCF)
  • Part 4 covered important stuff in the user interface (MVC)
  • Part 5 summarized the theory and outlined the new architecture

The implemented architecture is published on CodePlex in a project called Windows Mobile Architecture Blueprint, and this means that you can access the full source code as well as discuss it, come with suggested improvements, etc. As I walk you through the creation of the architecture, we suggest you keep the source code handy to check out more details.

nwdatacontext Ok, let's start building the architecture from the ground up!  To make things really simple (remember the KISS principle), we have started with a plain class library called Blueprint.Domain where we will keep my business domains. My first domain will be covering a small part of the classic Northwind database. I started by creating a LINQ2SQL data context called Northwind and dragged two of the Northwind tables into it (if you're like me, and don't have the Northwind database installed, you can get it here) as you can see on the right (note that we have removed the Picture field in the Category table to save bandwidth).

When that is done, a neat trick that will come in very handy is to select Properties on the design canvas of the data context and set Serialization Mode to Unidirectional. By doing this simple task, the code generated for the data context will include the necessary decorations (attributes) to make the data context ready to be published by WCF. If we look at a stripped version of the generated code (in Northwind.designer.cs)...

public partial class NorthwindDataContext : System.Data.Linq.DataContext
{
    [DataContract()]
    public partial class Category
    {
        [DataMember(Order=1)]
       
public int CategoryID
        {

...you will see that each class (entity) has a DataContract attribute, and each field (attribute) has a DataMember attribute. These attributes will be use by WCF when the entities are communicated.

In the code above, please also note that the generated class for the data context (NorthwindDataContext) is declared "partial" which perfectly matches our intention of implementing the business logic in a parallel class. By creating such a class (Northwind.cs), and putting in some simple code like this...

public partial class NorthwindDataContext
{
   
public Category[] GetCategories()
    {
        return Categories.ToArray();
    }
}

...we have implemented the first (however sparse) service into our first business domain, and the functionality is that it returns the list of all categories. Note that behind the scenes, LINQ comes into play, and to show a more obvious example, we can do this instead...

var q = from c in Categories select c;
return q.ToArray();

 

...and this will create the same result as the code above. Worth mentioning already is the fact that even if the Category entity holds a relation to all products in that category, those child entities are not loaded by default. This is a good thing as you probably don't want to load all products with all categories, but when you want to load related entities, you can do this by explicitly call...

var q = from c in Categories select c;
Category[] categories = q.ToArray();
categories[0].Products.Load();

...to load all the products for the first category. There are some other options for controlling how related entities are loaded, but it's out-of-scope for this blog post. In future posts in this series, we will cover more parts of the architecture blueprint implementation.

posted on Friday, May 02, 2008 10:23:32 AM UTC  by Andy  #    Comments [0]
 Friday, April 25, 2008

In the previous parts of this series, we have discussed the changes that affect the architecture design. It's now time to conclude what this all leads up to architecture-wise, and we propose that the architecture should look something like this:

newarch Most of the fundamental parts (three tiers, common services, etc), and even many of the more specific (service interfaces/agents, data access, business entities, etc) are exactly the same as in the Application Architecture for .NET that I've mentioned before in this series of blog posts.

Note that a significant change is the merge of the lower part of the middle (business services) tier and the bottom (data services) tier. As we've outlined before, this is where the business logic and its data comes together in a nice mix called the business domains. With technologies like LINQ to SQL and WCF, most (if not all) of the data services tier are actually created using code generation. This means that any changes made to the different sources (data sources and services) can be captured by regenerating the code. The tools support is actually prepared for this kind of evolution in the integration between systems, and a simple "Update Service Reference" menu selection is all that is needed.

Another similar change is the clear separation between the service interfaces and the business domains. Where the business domains have a clear responsibility to handle the logic and data for a certain business domain, the service interfaces (designed according to the facade pattern) has a different set of responsibilities. The primary distinction of a service interface is that it probably fulfills a specific part of the system's functionality (use case). Also, as they are the "first line of defense", they should handle things like basic security (authentication, authorization, encryption, etc) as well as secure coding techniques (parameter checking, prevent things like SQL/code injection, etc), compression, transactions, logging, etc. A consequence of the separation with the business domains is that the service can be placed in a separate assembly. This is a good thing because a service interface probably uses a number of business domains that may (or may not) exist in numerous assemblies.

Finally, the user interface parts have been renamed to align with the use of the MVC pattern, and as already mentioned in previous posts, this will allow for better testing and the use of the same user interface logic for different clients (thin Web interfaces built with ASP.NET, rich interfaces built with WinForms, WPF or Silverlight, and of course mobile clients built with .NET CF and soon Silverlight, etc).

In upcoming posts, we will continue with more of my thoughts on the changes in mobile architecture, and of course also some code samples to show the theory in practice. Stay tuned!

posted on Friday, April 25, 2008 10:22:54 AM UTC  by Andy  #    Comments [0]
 Monday, April 21, 2008

MSDN has a number of excellent "How Do I"-videos geared towards Windows Mobile-development. Don't miss it...

I've found the following to be very useful:

How Do I: Test Unit Tests for Devices?
How Do I: Update User Interface Controls in Multithreaded Applications?
How Do I: Efficiently Query a SQL Server Compact Database Using LINQ?

posted on Monday, April 21, 2008 7:23:18 AM UTC  by Andy  #    Comments [0]
 Friday, April 18, 2008

This time we will look a little closer at an important change on the user interface side of the architecture. We're talking about applying the MVC pattern (or rather its variation, the MVP pattern), and even if this change is far from recent (both mentioned patterns have been around for quite awhile), the importance of applying this pattern has increased. The reason is an increased focus on automatic testing, TDD, and continous integration. By applying the MVC pattern, the bulk of the logic of the user interface (located in a "controller"), can be tested independent of the actual user interface. This, and the more traditional benefits, that you can apply different "views" (user interfaces or more general, channels) to the same user interface logic, makes the MVC pattern a common part of any modern software architecture.

If you do some browsing on the Web, you quickly find that there are many implementation of the MVC pattern, but there are not that many specific to Windows Mobile developers (although most .NET implementations should migrate without much hazzle). One great initiative was the MCSF by Microsoft's patterns & practices team, which included a solid implementation of the MVC pattern (among many other) that was migrated from various application blocks for the full .NET Framework. However, the MCSF was so solid that it took a great deal of time to learn before you could be productive. Also, the MCSF is now a bit outdated, and judging from the lack of news or updates about it, our hopes are not up.

The community (and us too) wanted something simpler, and in some projects, we have used a very simple and straightforward implementation by our former fellow MVP, Alex Yakhnin (he's now employed by Microsoft), that he published as a small blog series last fall (see part 1 and part 2). In those blog posts Alex also showed a simple solution to a very common problem when building great UX for Windows Mobile, and that is to handle the caching of forms. Loading a form is an expensive task in terms of performance, and therefore it's necessary to cache the forms in memory.

In upcoming posts, we will continue with more of my thoughts on the changes in mobile architecture, and of course also some code samples to show the theory in practice.

posted on Friday, April 18, 2008 10:21:55 AM UTC  by Andy  #    Comments [0]
 Sunday, April 13, 2008

Don't miss the MSDN WebCast: Creating Location-Aware Applications for Windows Mobile Devices (Level 300)

"More and more Windows Mobile powered devices ship with integrated global positioning system (GPS) hardware. Since Windows Mobile devices are typically used on the road, it makes a lot of sense to add location awareness to your applications. In this MSDN webcast, Maarten Struys shows you how you can make use of the GPS Intermediate Driver to access GPS information from inside managed applications. Learn how to use the FakeGPS utility to test location-enabled applications without needing access to a physical GPS device. Of course, in this session, you also see a location-aware application on a device using real GPS data."

 

posted on Sunday, April 13, 2008 7:19:14 AM UTC  by Andy  #    Comments [0]
 Friday, April 11, 2008

Developing sites that are well suited for use from mobile devices is a real challenge. I was recently interviewed by Computer Sweden on the subject and I highlighted five key areas to stay on top of:

 

  1. The browser
  2. The web site
  3. The resolution
  4. Bandwidth
  5. Input mechanisms

Be sure to not miss the following great MSDN-content that gets you started from the right place:

 

Walkthrough: Creating Web Pages for Mobile Devices

ASP.NET Mobile Web Development Overview

posted on Friday, April 11, 2008 6:44:16 AM UTC  by Andy  #    Comments [0]
 Friday, April 04, 2008

To continue this series that started with A New Mobile N-tier Architecture (part 1), we will talk more about the changes in a modern mobile multi-tier architecture.  We can see that the most important changes are happening on two levels, and the first is the tighter bond between the business logic and it's data.

classicntierBefore, we had a distinct separation in the two lower tiers between the logic and the data. The thinking was that the data services could be used by several parts of the business logic to handle basic CRUD operations. This is shown in the Application Architecture for .NET from 2002 that you see on the left where the business logic and the data access was divided into the lower two of the classic three tiers. However, the problem was that data without logic is almost useless, and even if the logic existed (in various business components) the natural relation with the data was not manifested.

The other change is the change in the way that clients exchange information with the server (or more general, the way that two systems or peers exchange information), and that will be the focus of the next part in this series.

newntier

If we look at technologies like LINQ and specifically LINQ2SQL (LINQ to SQL) the traditional separation between the logic and the data is encouraged. On the right you find an illustration what is happening in the lower two of the traditional three tiers. The observant note that the business entities is moving down to he data tier (where they belong), but more importantly, the two tiers are actually moving together. With a LINQ2SQL, the business logic can be implemented in the same data context (the ORM) class (by using the ability to define partial classes). We would like to call these merged entities domain components as they define and handle both the data and the logic for a specific business domain. So, the service interface (facade) would actually work with a number of domain components to deliver functionality to its clients. The challenge is how the functionality (logic + data) is spread among the domains to make them a perfect tradeoff between versatility and reusability. The bigger, the more versatile, the smaller, the more reusable. The general message is probably to keep them small and distinct.

In upcoming posts, we will continue with more of my thoughts on the changes in mobile architecture, and of course also some code samples to show the theory in practice.

posted on Friday, April 04, 2008 10:15:32 AM UTC  by Andy  #    Comments [0]
 Friday, March 28, 2008

When we wrote our book Pocket PC Development in the Enterprise back in 2001, one of our goals was to help developers with an architectural blueprint for building solid mobile multi-tier applications. At that time, most focus for mobile developers was on the user interface and the device side of the mobile solution.

Since then, a lot of things have changed. The Windows Mobile development platform with .NET Compact Framework as the foundation, has evolved into a very powerful offering to mobile developers. Technologies has constantly migrated from the desktop (full) framework, even if it sometimes seems too slow when one is eagerly waiting. Who else is eager to use LINQ to SQL with SQL Server Compact, full WCF support, or build mobile Silverlight applications?

But, some things remain the same, and one of these is the view on mobile solutions as being a part of a bigger whole. Almost no mobile applications live alone! In most cases, they are part of an integrated solution that extend existing business processes to reach further out in the hands of the employees. Therefore, a modern mobile architecture starts with a solid architecture on the server, and can be extended to support multiple channels (thin/rich clients, fixed/mobile devices, etc).

During the years since we wrote the book, the blueprint has evolved with the changes in technology. We say evolve, because most changes only meant that the architecture was upgraded to embrace the new technologies. Recently, however, some major changes has occurred that force some more drastic changes to the architecture. The most significant are LINQ (specifically LINQ to SQL and the upcoming ADO.NET Entity Framework), WCF, and Silverlight. The observant reader notes that these technologies span the whole architecture spectrum from data access, via communcation links to UX. In addition to these, there are also a number of enhancements for the mobile developer that spice up an architecture that in addition to support traditional clients, it also needs to support mobile clients as well.

As you will see, when we move forward in this series of blog posts, we're a big fan of the KISS principle. Therefore, the primary goal is to keep things as simple as possible to minimize the learning curve while at the same time still create a valid architecture that is easy to implement, test, and maintain.

In upcoming posts, we will continue with more of our thoughts on the changes in architecture in general and more specifically on architectures that suite mobile solutions.

posted on Friday, March 28, 2008 10:12:19 AM UTC  by Andy  #    Comments [0]
 Friday, January 11, 2008

As you know, I am busy migrating a project from eMbedded Visual Basic to .NET Compact Framework and C#. A key component in the legacy code is the way controls are populated and this is an area where I've had to workaround an issue in .NET Compact Framework.

In eVB you could do this:

Form(sControlName).Text = "Some value"

In other words, you could easily loop through all controls in a form and save names and values.

For iCounter = 0 To Form.Controls.Count - 1
sControlName = Form.Controls(iCounter).Name

You could then retrieve control names and values from the database and re-populate forms. In eVB, all controls in the form sit in the Form.Controls-collection. In .NET Compact Framework you can not address a control by its name in the Form.Controls-collection, only by its index in the collection:

Form.Controls[formControlIndex]

Furthermore, all controls in the form do not sit in the Form.Controls-collection. For instance, if you place controls in a panel, then those controls are found in the Form.Controls[IndexOfPanel],Controls-collection. I've solved these two migration issues by using a hashtable that stores the name of the control as the hash-key, and the control's index as the hash-value. In order to keep track of controls sitting in panels, I add the panel name to the control name when populating the hashtable.

First, when saving the data, I loop through the controls in the form:

foreach (Control formControl in Form.Controls)
{
   
/// Don't add data from disabled controls!
    if (formControl.Enabled)
    {
       
// Pull out control: the control, form and index
        // Is control a panel?
        if (formControl.GetType().ToString() == "System.Windows.Forms.Panel")
        {
           
// Get index of formControl, ie the panel
            formControlIndex = Form.Controls.IndexOf(formControl);

           
// Loop through controls in panel
            foreach (Control panelControl in Form.Controls[formControlIndex].Controls)
            {
                containerName = formControl.Name;

               
// Call save method. Pass ID, name of the form, the entire CONTROL that
                // sits IN the panel, and the name of the panel.
                SaveControl(ID, sFormName, panelControl, containerName);
            }
        }
       
else
        {
           
// Call save method. Pass ID, name of the form, the entire CONTROL that
            // sits IN the form, and the form name again.

            // The form name is the container.
            SaveControl(ID, sFormName, formControl, sFormName);
        }
    }
}

In the SaveControl-method, I can easily work with the control. For example, I can write:

sControlValue = ControlToSave.Text;

…to get the control's Text-property.

When opening the form I first need to create the hashtable of controls, so I can get at their index-values! The following method returns a hashtable with all controls in a form:

public Hashtable GetControls(Form form)
{
   
Hashtable formControlsHash = new Hashtable();
   
int formControlIndex;
   
int panelControlIndex;
   
string formControlName;
   
string panelControlName;

   
// Populate SmartControls with forms controls.
    foreach (Control formControl in form.Controls)
    {
       
// Get index of formControl
        formControlIndex = form.Controls.IndexOf(formControl);

       
// Get name of control.
        formControlName = formControl.Name;

       
// Add control to hashtable
        formControlsHash.Add(formControlName, formControlIndex);

       
if (formControl.GetType().ToString() == "System.Windows.Forms.Panel")
        {
           
// Loop through controls in panel
            foreach (