11 September 2006

Cool conference in Bulgaria

DevReach - one of the most exiting conferences about Microsoft technologies in Bulgaria is coming. According to the program, some of the world leading industry speakers will present quite interesting lectures. Hope we will meet there.

Google toolbar 4

This morning I was amazed! A few minutes after turning on my PC a small balloon appeared. The message in the balloon was something about Google toolbar update. Who cares, was my first reaction. But when the update was finished I was surprised to learn that LONG WAITING FEATURES LIKE ACCESSING BOOKMARKS FROM ANY COMPUTER are already present. Believe me - this is like a elixir of life for me. I'm using one PC at work, one PC at home and one laptop. Managing bookmarks in situation like this is almost nightmare. In the past there were some other decision of this problem, but none of them was so elegant as Google toolbar. BTW, Microsoft are developing the same service, but as far as I know this feature is still in beta.
The other features I like are SpellCheck and Translate. If you are inspired, install the toolbar from here for WinXP and IE. Enjoy!

04 September 2006

ADO.NET Entity Framework ContextObject and ASP.NET application

Last month Microsoft published first CTP of ADO.NET Entity Framework. For more info - look here. Although Microsoft is still planning integration between Entity Framework and ASP.NET, I want to show you how to handle ADO.NET Entity Framewrok context object in ASP.NET application. This post is inspired from NHibernate session management.
The idea is simple: Context object will be stored in ASP.NET session and after the request HTTPModule will free it. I'm using ASP.NET session instead of ASP.NET context to further extend this example to support session per application transaction strategy. If you are wondering what is "session per application transaction" take a look at NHibernate session management. Here is the code of the implementation:

public class ContextManager<T>where T: ObjectContext, new()
{
    public static T ObjectContext
    {
        get
        {
            T resultContext;
 
            if (HttpContext.Current.Items.Contains(
                ContextConst.CONTEXT_OBJECT_SESSION_KEY))
            {
                resultContext =
                    (T)HttpContext.Current.Items[
                        ContextConst.CONTEXT_OBJECT_SESSION_KEY];
            }
            else
            {
                resultContext = new T();
                HttpContext.Current.Items[ContextConst.CONTEXT_OBJECT_SESSION_KEY] = 
                    resultContext;
            }
 
            return resultContext;
        }
    }
 
    public static bool isActiveObjectContext
    {
        get
        { 
            return HttpContext.Current.Items.Contains(
                ContextConst.CONTEXT_OBJECT_SESSION_KEY);
        }
    }
 }

public class ContextHttpModule : IHttpModule 
{
    #region IHttpModule Members
 
    public void Init(HttpApplication context)
    {
        context.EndRequest += new EventHandler(OnEndRequest);
    }
 
    public void Dispose()
    {
        //Intentionaly not implemented
    }
 
    public void OnEndRequest(Object sender, EventArgs e)
    {
        if (HttpContext.Current.Items.Contains(ContextConst.CONTEXT_OBJECT_SESSION_KEY))
        {
            ObjectContext contextObject = 
                (ObjectContext)HttpContext.Current.Items[
                    ContextConst.CONTEXT_OBJECT_SESSION_KEY];
 
            contextObject.Dispose();
        }
    }
 
    #endregion
}


internal class ContextConst
{
    public const string CONTEXT_OBJECT_SESSION_KEY =
        "ContextConst.CONTEXT_OBJECT_SESSION_KEY";
}

Now, lets look how the code above can be used. First lets make some corrections to web.config file:

<connectionStrings>
  <add name="Duwamish7Model.Duwamish7" 
       connectionString="metadata=C:\Temp\ContextObject\Model;
          mapping=C:\Temp\ContextObject\Model;
          provider=System.Data.SqlClient;
          provider connection string=&quot;Data Source=ns-server;
          Initial Catalog=Duwamish7;Integrated Security=True&quot;"
    providerName="System.Data.Mapping" />
</connectionStrings>


<httpModules>
  <add name="ContextObjectManager"
       type="ObjectContextManager.ContextHttpModule, ObjectContextManager"/>
</httpModules>
Having all of the above done, we can write somethig like this:

Duwamish7 db = ContextManager<Duwamish7>.ObjectContext;
 
Query<Authors> query = db.GetQuery<Authors>(
    "SELECT VALUE a FROM Authors AS a WHERE a.PKId > 144");
 
Repeater1.DataSource = query;
Repeater1.DataBind();


P.S. The code above is not tested for concurrency problems.

03 September 2006

WCF and WS Eventing

WCF (aka Indigo) is the latest communication technology from Microsoft (still in beta). Although there are a lot of goodies in this technology, something really useful for me is missing - implementation of WS Eventing. If you are wondering why - this article gives the answer. Fortunately there is already non-Microsoft implementation. Read this article if you are interested.