Implementing MVC pattern in .NET CF applications (Part 2).
Let's continue on the way how-to implement the model-viewer-controller pattern in .NET Compact Framework applications that I started in my previous post. We stopped at the point where we needed to figure out on how to connect the LoginController with the concrete instance of the LoginForm. Of course we can create an instance of the LoginController class when loading the LoginForm, but in this case we would break the decoupling by doing this. The better solution would be to create another class ApplicationManager that will be responsible for instantiation of the LoginForm (or any other forms that you will have in your application), keeping a memory cache of the loaded forms and displaying/hiding them. So here we go:
5. Create ApplicationManager class
public class ApplicationManager
{
#region fields
private static ApplicationManager appManager;
private Dictionary<string, IController> controllersCache;
#endregion
#region constructors
static ApplicationManager()
{
// Create an instance of itself for a singleton
appManager = new ApplicationManager();
}
public ApplicationManager()
{
controllersCache = new Dictionary<string, IController>();
}
#endregion
public static ApplicationManager Instance
{
get
{
return appManager;
}
}
public LoginForm GetLoginForm()
{
// Check if we already have the form in the cache
if (!controllersCache.ContainsKey("Login"))
{
controllersCache.Add("Login",
new LoginController(new LoginForm()));
}
return controllersCache["Login"].View
as LoginForm;
}
public void ShowLoginForm()
{
if (!controllersCache.ContainsKey("Login"))
{
controllersCache.Add("Login",
new LoginController(new LoginForm()));
}
controllersCache["Login"].View.Show();
}
}
I've implemented the ApplicationManager as a singleton. It creates an instance of its own in the static constructor and also implements the static property Instance to expose the singleton for consuming parts. It also includes the controllersCache dictionary that stores instances of the controllers with associated viewer in it.
OK, we are almost done here. Just one thing is left - to make a call to the ApplicationManager to get an instance of the LoginForm. For example, we can do it in the entry point of our application:
[MTAThread]
static void Main()
{
LoginForm form = ApplicationManager.Instance.GetLoginForm();
Application.Run(form);
}
So that is all to it. You should be able to take it from here: add more forms to the project and implement the view and controller for them. You can download the project from here, so you should be able to step through the code and see how it works.
Comments
Anonymous
August 07, 2007
Shouldn't the instance constructor for the ApplicationManager class be non-public?Anonymous
August 07, 2007
Also, I'm not seeing the Model anywhere in your MVC implementation.Anonymous
August 07, 2007
Hi Neil, You are right, it is mostly viewer+controller. You should be able to plug in any model into it. -AlexAnonymous
August 07, 2007
As Neil has astutely observed, the code that I described in my previous posts does not have an implementationAnonymous
October 09, 2008
I've just got back from a long and big project with one of our customers for whom we have created anAnonymous
October 29, 2008
Hi Alex, Nice work! You might also want to take a look at <a href="http://www.mvcsharp.org" title="Model View Presenter for .NET">MVC#</a> - a Model-View-Presenter framework with .NET Compact Framework support. Kind regards, -- Oleg ZhukovAnonymous
August 23, 2009
It's perfect... I am just curious to verify if you are having a singleton instance then why the second constructor is public. I have one point - what's major reason you did not prefer the MCSF?Is it only slowness?Anonymous
August 30, 2009
The MCSF is slow. Take a look at the Mobile MVC: http://blogs.msdn.com/priozersk/archive/tags/MVC/default.aspx