Because Evejob Project developed in few frameworks, we need to make clear “terminology” differences used by different frameworks as well as different strategies to develop MVC applications using such frameworks. Let’s start from MVC frameworks: 1) ASP.NET MVC as we see from name is “Model-View-Controller” framework (powered by .NET framework), so use actually concepts of “Models”, “Views” and “Controllers”. “Views” and “Controllers” concepts defined by framework itself (i.e. you need to inherit controllers from System.Web.Mvc.Controller class and inherit views from System.Web.Mvc.ViewPage to use build-in view engine). It is also possible in ASP.NET MVC to attach third-party View Engine (just google and you will found at least few). But “Models” concept in ASP.NET MVC is true “concept” – you don’t need to inherit from some base class or implement some interface to made a models in ASP.NET MVC! Instead framework provide you will full flexibility to create your own domain model and select any persistent framework if you need to persist your model entities. You can use for example Entity Framework, Linq to SQL, any other ORM or even POCO to implement your models! 2) Ruby On Rails is true “Model-View-Controller” framework and more so it uses “convention over configuration” principle. This mean that you actually have already defined conventions where to put your model entities, where to put controllers and where to put views (templates) and how to implement them (from what class you need to inherit etc). Sure while it is still possible to made some changes and even use another ORMs etc, build-in (OK, read instead “installed by default with Rails”) ActiveRecord ORM is enough for most cases (OK, at least in most simple cases ). The same things with templates (views) – you can use build in template engines (provided by ActiveView module) or add your own – at the time I write this exists not less then 20! different third-party template engines in addition to build-in (sure you can always build your own if need and made 21-th)! 3) Grails is really “Model-View-Controller” framework, was build with same principles like RoR, but because Grails work on top of Spring and Hibernate, developers initially get BEST build-in enterprise infrastructure from Java world! And sure in Grails infrastructure was extended so much (thanks to power of Groovy), that it looks like it most powerful MVC framework to the moment (this is just my personal opinion – I don’t want to start a war here )!
So frameworks listed above all follow MVC terminology where you actually create your own Models (Domain Models possible with Persistence), implement Controller (with actions) and create presentation using Views (that is actually powered by some build-in or custom template engine).
One framework – Django – that we use for Evejob project made use of a little different terminology (instead of MVC): Model-View-Template. Model term is used for same purposes like Model in MVC – it is simply domain model (provided usually by build-in to Django ORM, but also possible to use your own ORM… just note that it require little more “tuning / hacking” than in other frameworks). View in Django play the same role as Controller in MVC. And “Template” term in MVT actually used instead of “View” from MVC (while Template terms actually also used in MVC in sense that view CAN be represented as result of Template rendering) What I found from my experience that this difference in terminology does NOT make any actually impact on development process! More so, actually most MVCs that available in the market used mostly in “MTC” mode – i.e. “Model-Template-Controller”. What does it means? It means that Controllers actually render Templates in MOST of the cases! Sure in case if you use MVC framework to build for example Web Services, you will probably not render any Templates and your controllers (controllers in MVC or your Views in MVT) actually more likely will return JSON or XML directly (OK… XML it is possible also to build using Templates sometimes – look how it is done in Grails for example! But let’s think here that we want to return raw XML from Controller without any template engine). Sometimes you also can return JavaScript or any other format etc directly from Views in MVT or from Controllers in MVC. What is good in MVT is “order” of letters that give better understanding for developers that first time here about this pattern – “Model” <-> “View” <-> “Template”. This way logical flow going – i.e. views are in the “middle” of this logical flow! (using this principle it was better initially probably call MVC as MCV, i.e. “Model” <-> “Controller” <-> “View” , so “Controllers” become in the middle, center of logic). It related only to logical structure, because in MVC pattern, Model accessible (and used) actually in both Controller and View, same like in MVT both Views and Templates share same Model! You can read a short overview of MVC at Wikipedia article for example if want little more information) But as I tell before – main thing is “understanding” how pattern works, not how we call it! And “idea” of implementation of this patter in Django and other frameworks is exactly same even so name is not!
.NET development Environment Installation
Creating EvejobNET Solution
Open Visual Studio, select “File / New Project” and fill form with following details (make sure you select ASP.NET MVC Web Application template):
Press “OK” and on next window “Create Unit Test Project”, select “Yes” and press OK:
You will get solution loaded into Visual Studio with 2 projects: ASP.NET MVC Application (EvejobNET) and Unit Tests project (EvejobNET.Tests):
You can now try to run it, just press “Start Debuging” Button and make sure that you agree with action to “Modify the Web.config file to Enable Debugging”. Your default browser will open test site, hosted by development server (build in into Visual Studio).
Creating EvejobAzNET Azure Solution
Go to “File / New Project”, select “Cloud Service” template in New Project Window and fill project name and path like on following screenshot:
After you press “OK” you will need to select Roles to be added to solution. At the time I write this, there was no ASP.NET MVC role available, so let’s just temporary add ASP.NET Web Role (keep default name for now):
After you press OK, solution will be opened with WebRole1 Project. Now it is time to remove “WebRole1″ temp project from solution (don’t forget to delete unused folder, with content, WebRole1 in C:\evejob\EvejobAzNET).
Next step is to add new ASP.NET MVC project: like was done above for EvejobNET project – just simply right click in solution explorer on “Solution ‘EvejobAzNET’” and select “Add New Project”, than select ASP.NET MVC Web Application Template and give this template name “EvejobAzNETMvcWebRole” to keep Azure standard naming convention.
One more step to finish – you need to associate role, so in solution explorer right click on “No project associated (WebRole1)” and select same like on screenshot:
In opened window for association, make sure that you select “EvejobAzNETMvcWebRole” project:
Your solution will looks like this now:
Now it’s time to test it – just press “Start Debugging” in Visual Studio. Probably you will get following question (if everything going well):
Sure thing, correct answer “Yes” Ones it finished you will get another window that show “Development Storage Initialization” – just press “OK” button here and continue with execution.
You can get following popup also:
I hope you answer yes, as probably you want to be sure that you use latest Tools available for Azure
Finally, your default browser probably opens with http://127.0.0.1:81/ Url and you will see “My MVC Application”
If so, that we just prepare everything to start EvejobAzNET development
Ah, one small note – you can check status in “Development Fabric” and in “Development Storage” – small icons are added to Windows taskbar – right click on each and select “Show …”:
Thats it!
“Evejob” is a Web 2.0 style Social Job Board Open Source web application developed in few frameworks / programming languages simultaneously and released under GPLv2 license.
Why another job board application?
First – every developer understand naturally such business domain because at least one time in his live he was a “Job Seeker” and some day probably also become (will or already) an “Employer”. So I (and readers) will not spend time to learn business domain in developing Job Board application! (sometimes really huge amount of time team or independent developer just learn business domain of application… It’s actually wrong to think about this as “time waste” because as much developers understand the business as more better software they usually made!).
Another reason why I decide to create another job board open source application(s) is absence of such project developed in true MVC architecture (at least by now). Try to search open source Job Board software? You will found huge amount of poorly written PHP scripts (most are not open source) and for sure you will not found any good ASP.NET MVC or Ruby on Rails implementations… Social Job Board software have a huge “potential” and I don’t want to lost opportunity to develop good open source version of such application (and even more – first few versions powered by different platforms!).
Last reason which I want to list here (in reality I have much more reasons for sure), is that I have some cool ideas how to make really SOCIAL Job Board and want to at least try such ideas on practice!
Evejob Application Versions
So, there will be few major versions of Evejob applications:
All versions will be developed and updated in parallel with comparisons between frameworks / languages features, platforms and even IDEs in the way …
Why I will release project as Open Source? Sure primary reason because I want other developers will get benefits from it, like I now get benefits from all open source software that I use every day. Another reason – I want to made this application better, so I need feedback, and not only from end users, but also from other developers! In my case, because I get used few different programming languages, I will probably get really huge feedback – at least few times more then if i will write code using one language! I will get feedback from developers with different cultures (Unix vs Windows environment), different preferable coding styles (dynamic language or static) etc… Think project will benefit from this (and actually I never see something like this before so it will be at least interesting to get a try … ) !
Agile Development
As you probably understand by now, I am a huge fun of Agile development (and even Agile life).
What this means for selected project:
Integrated Development Environments
One thing where I really don’t want to go most simple way is usage of Integrated Development Environments (IDEs) … While all development can be done using even simple text editors (notepad, vim, Emacs etc) I decide to implement this project using rich IDEs available for selected platforms.
Reason – most of developers DO use IDE at work (companies simply buy it) and I think this will help developers to make total compare of PLATFORMS, not just frameworks or programming languages. While a lot of people can argue that IDE does not make any difference (and probably they are right in some cases), I think usage of IDE can significantly decrease developing time ones you get use of functionality they have and sometimes even improve discipline (with tools like ReSharper for C# for example) of developers.
So here is the list of IDEs I am going to use:
Why I choose IntelliJ IDEA, but not Eclipse or Netbeans (really good free alternative to IDEA) or Wing or Komodo etc? For .NET development, Visual Studio is STANDARD and Express Edition that available for free simply “for users other than professional software developers, such as hobbyists and students.” (but even so Express Edition should also work for you). Because my goal is to be at least “professional software developers” (and readers I think also) I must use at least Standard version of Visual Studio that is not free (except cases when Microsoft give it for free for start-ups etc, like on http://www.microsoft.com/bizspark/ for example)… So to make fair comparison I must use something not free for other versions also… This means that great tools like Netbeans or Eclipse simple can’t be used in this case (as both are completely free). Sure if you going to made your own projects you can use Netbeans or Eclipse because both have good support for both Ruby on Rails and Grails development and even Django (with some additional external tools / plugins). Regarding Komodo / Wing etc, they are too specific for selected languages or does not support all frameworks I need (at least by now). While it is available free IntelliJ IDEA version for open source developing, because I (and readers) some day going to make a money, it’s make sense to compare versions for commercial development.
Application Hosting
Hosting… Yes, while I can leave this decision for later in theory, in practice it can (and will) effect our architecture… So let’s made it clear now: I am going to host Grails, Django and Ruby On Rails versions of Evejob application in Google AppEngine. Google AppEngine support Python natively so we can run Django here. Also last version of AppEngine support Java as programming language. So because Grails leverages Groovy (which written on Java), we can also run Grails applications in AppEngine. Same for Ruby On Rails – it is available JRuby implementation of Ruby on Java so we can run Ruby On Rails applications in Google App Engine. To host ASP.NET MVC application in I am going to use latest Microsoft Azure platform.
Operation System
I am going to make all development under Microsoft Windows 7 64 bit Operation System (OS). Visual Studio 2008 does not work on any other non-Windows operation system directly (and I don’t want to use virtualization for such case – IDE must work on operation system for which it was written to get maximum performance… but, while IDEA works on almost any OS, Visual Studio does not!). Even so, It is still exists option to use Mono (cross platform Open Source development framework) to run ASP.NET MVC on other OS except Windows, and to use MonoDevelop instead of Visual Studio for example. Unfortunately I decide to port application to Mono AFTER development will be completed. (primary because I just want to wait until Microsoft legally allow to use Mono or finally will just “close” it, so I will not need to release another version for this wonderful framework).
Project sources, links and documentation