WWF – Cannot load project type

I as a beginner of Windows Foundation stuffs: Workflow, Communication, Presentation, have first read book about Windows Workflow Foundation: Pro WF Windows Workflow in .NET 3.5, author Bruce Bukivics.

The book easily gets me stuck in reading, so interesting. I finished reading 2 chapters and felt the eager to start on something the book says. The only ways to get things remember while reading is doing something practical: start programming in this case.

Can you guess what did happen when i create an WF project?? My VS2008 said: the syste failed to load this project type. It nearly killed me at a shoot. My normal process will be, ask my friend Google. However thing was not that easy. I spent many hours to look for the solution. Not much luck at that time. However i am lucky today.

The solution is quite simple 🙂 :

  • Open command line for VS, VS -> VS Tools -> Command promp.
  • Run: devenv /setup

Bravo it works, the source of solution can be reached here

AjaxPro – first try

As i mentioned in the previous post, i now start with my code base for stories of version 1.0. In general, it contains 3 layers as other software. Data access, Business, and Presentation. Let see what i have in my mind:

  1. Data access: wow i can do all the stuffs with NHibernate. So just ignore it for now. I have tried NHibernate before, so it is not so difficult to get started.
  2. Business layer: As you can see all user stories in this version. Simple, right? Yes, it is. So just build the objects i need first, however, no need to say them here.
  3. Presentation: I want to keep it as simple as possible. However, it should be a rich web page which means that there is no real postback. Yeah THIS IS THING I TALK IN THIS POST.

AJAX! sure i should use AJAX to communication between client and server. The thing is which one? There are some options:

  1. ADO with data service: implement as webserver when you want to ask something from server.
  2. AjaxPro: Call method in the current page without posting back. I vote for this.

Basically, this technique was not new to me since in the company i have been working with a technique called ServerMethods, developed by our talent developers, except me. It has been there sine i went in. However, AjaxPro is much better which many types supported and it is constantly developed by the community, go in ajaxpro for more detail.

All you need to do to get it works is:

  • Add ajaxpro.dll into web reference.
  • Register type of class you are using ajaxpro.
  • And then call it from the client site.

Here what i did, simple:

Server side:

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using AjaxPro;
using AnhDuc.BookStore.BusinessLayer;

namespace AnhDuc.BookStore
{
   public partial class Default : Page
   {
      protected void Page_Load(object sender, EventArgs e)
      {
         AjaxPro.Utility.RegisterTypeForAjax(typeof (Default));
      }

      [AjaxMethod]
      public Book GetResult(string searchKeyWord)
      {
         return new Book() {Name = searchKeyWord};
      }
   }
}

And from client side:

   function startSearch() {
          try {
             var _book = AnhDuc.BookStore.Default.GetResult($("#_txtKeyname").val()).value;
             alert(_book.Name);
          }
          catch (e) {
             alert(e.message);
          }
       }

That’s enough! I am going to finish the user story 1 soon.

NHibernate first attemp in blog system

As mention in the previous post, i started my application with first try in NHibernate. Wow it was sweat try. Eventually i got it works.

After nearly 4 hours fighting with NHibernate and my application, i had these in general:

general structure
general structure

Let says a little bit about them before continuing:

  • AnhDuc.Blog: Web site application
  • AnhDuc.Blog.Business: Project contains all business logics for the site
  • AnhDuc.Common: Project contains common things which can be used widely or in other projects.

Since i was using NHibernate then there was not DataAccess project.

Time to talk about using NHibernate. I have read some article and NHibernate In Action book to accomplish the usage. Basically here are steps:

Required Dlls:

Download NHibernate dlls and other required dlls. You can easy get them by using your friend: Google, thus i do not mention here.

Configuration:

First, you need these in webconfig. All you need to do is copy this part and paste in your config then change the connection string to the right one: 

< hibernate-configuration xmlns=urn:nhibernate-configuration-2.2 >
< session-factory>
<property name=connection.driver_class>NHibernate.Driver.SqlClientDriver</property>
<property name=connection.connection_string>Server=(local);initial catalog=anhduc_blog;Integrated Security=SSPI</property>
<property name=adonet.batch_size>10</property>
<property name=show_sql>false</property>
<property name=dialect>NHibernate.Dialect.MsSql2000Dialect</property>
<property name=use_outer_join>true</property>
<property name=command_timeout>60</property>
<property name=query.substitutions>true 1, false 0, yes ‘Y’, no ‘N’</property>
<property name=proxyfactory.factory_class>NHibernate.ByteCode.LinFu.ProxyFactoryFactory,

NHibernate.ByteCode.LinFu</property>

<mapping assembly=AnhDuc.Blog.Business />

</session-factory>

</hibernate-configuration>

Then i came with code to initialize the configuration: NHibernateSessionManager class.

public sealed class NHibernateSessionManager
{
private static readonly ISessionFactory _sessionFactory;
private const String CurrentSessionKey = “anhduc.blog.nhibernate.currentsession”;
static NHibernateSessionManager()
{
Configuration cfg = new Configuration();
//cfg.AddAssembly((typeof (BlogItem)).Assembly);
cfg.Configure();

_sessionFactory = cfg.BuildSessionFactory();
}

public static ISession GetCurrentSession()
{
HttpContext context = HttpContext.Current;
ISession session = context.Items[CurrentSessionKey] as ISession;
if(session==null)
{
session = _sessionFactory.OpenSession();
context.Items[CurrentSessionKey] = session;
}
return session;
}

public static void CloseCurrentSession()
{
HttpContext context = HttpContext.Current;
ISession session = context.Items[CurrentSessionKey] as ISession;
if (session == null)
return;
session.Close();
context.Items.Remove(CurrentSessionKey);
}

public static void CloseSessionFactory()
{
if (_sessionFactory != null)
_sessionFactory.Close();
}

public static void CommitTransaction()
{
GetCurrentSession().Transaction.Commit();
}

public static void AbortTransaction()
{
GetCurrentSession().Transaction.Rollback();
}
}

It contains some methods to deal with transaction.

The configuration is done, and ready to use. Come to your business class.

Business classes:

They are all under AnhDuc.Blog,Business project. Each class has its own mapping file. All mapping files are put under hbm folder. I am not going to explain in detail about mapping here. However, it is the most important thing when you work with NHibernate.

Be aware of inheritance when designing your domain. In many cases, inheritance is not encouraged.

Recommended book: NHibernate In Action June 2008

Blog system – introduction

So far i have read many articles about web application development. So general speaking, i have tools in hand to build a website in no time with less effort. Just need to structure code and deal with business logic.

Here are some:

  1. NHibernate: Deal with DataAccess layer and maybe more.
  2. AJAX data template , deal with binding data into grid, the GUI things
  3. IoC, from Windsor, and Mock from Rhino deal with DI and Unit testing
  4. jQuery to work with JavaScript
  5. NUnit to test my code

That’s quite enough! However i have never interated them in one application at all. That’s why i am going to make a simple web application to demonstrate my understanding.

The web is about a blog site with:

  1. List of categories on the left.
  2. Click on one category, then list out all blogs in that category in short.
  3. Click on one blog item, then the detail is displayed

Assuming that, all data will be added into DB directly. What i want to archive are:

  1. Of course, the system works
  2. Easy to extend, since i will add administrative functions later: Add, Edit, Delete,…
  3. Easy to maintain code.
  4. Apply all the things i have known so far, those i list above.

Along with the development process, i will update my blog. I am sure there will be more fun while doing it, yeah with difficulties as well.