Dan's Green Shoes

Got my green shoes on!

clip_image010_thumb.jpg


4 Comments

SignalR with Silverlight 5

SignalR is truly an amazing API. It’s ridiculously easy to use. The majority of SignalR client examples that I see on the web are for HTML/JS or WPF. There are examples for Silverlight but for older version of SignalR and Silverlight. What I was hoping to find was a step by step example using VS2k12, SL5 and latest greatest Nuget Packages. Since I could not find one, I thought I would create one and share. This step by step was highly inspired by the samples found here:

https://github.com/SignalR/SignalR/tree/master/samples

Setting up the Solution

Recommend you download the code and follow along. In Visual Studio 2012, create a new Silverlight 5 application called “SilverlightClientSignalR” as seen below. Continue reading


2 Comments

Calling into your database on Silverlight Application_Exit

My team has developed several Line of Business applications using Silverlight.  Most but not all have at least 3 if not all of the following feature requests:

  • Allow users to be signed into the LOB more than once. Users like having more than 1 browser tab or even more than 1 browser type with the LOB app loaded simultaneously.
  • Ability to differentiate between a user in Tab1 versus Tab2 for purposes of concurrency, etc.
  • Limit the number of simultaneous sessions a specific user can have. 1 is a valid constraint.
  • Automatically log out a user instance after X seconds a.k.a session time out
  • Gather user information such as browser type/version, screen resolution, IP, etc
  • # of concurrent distinct users logged in over time.
  • # of concurrent users logged in over time total.
  • Max or average simultaneous sessions by users.

All of these are good feature requests for any Line of Business Application. Thinking through it, these features share an implementation detail that requires the LOB to track each signed in user instance.

Implementation Plan

Here was the plan.

  1. Create a new database table called AppInstance. This table will contain a list of all the active users in the system.
  2. Create a new database table called ArchivedAppInstance. This table contains all previously logged in users.
  3. Whenever a user logs in, add a row to the AppInstance table that records the UserId, timestamp of when that user logged in and any other information your LOB might want to know.
  4. Whenever a user logs out, archive the #3 AppInstance row to ArchivedAppInstance table noting the logged out timestamp.

The information in these 2 new tables enable the implementation of the features above. Conceptually this is very simple. In fact, 1 through 3 above are easy. #4 it turns out, in Silverlight was not as straight forward as one might think. Why? First, there are multiple ways the application can be exited such as clicking the LOB “Log Out” button, closing the browser directly, navigating away from the LOB web page or, heaven forbid, a browser crash. Except for crashing, the Silverlight application’s Exit event is raised but if you try to perform some backend action like calling a web service it won’t go through since the thread required to make the service call itself is gone.

I worked on a team to solve this. My colleague Tammy McClellan recently documented our approach for other product owners internally and I thought I would share on my blog. In addition, Tammy created an extremely small and simple sample application with our implementation. You can find the code here.

Continue reading


1 Comment

Using your “User” table with MVC4 Internet Template

The MVC4 Internet template assumes that it will be adding a user table called “UserProfile” to your database.  What I think a high percentage of developers would want is to use their domain model’s “user” entity and have SimpleMembership just manage the passwords.  In this blog post I will demonstrate how I did this and welcome alternative suggestions.
I recommend you first understand the authentication process provided by the MVC 4 Internet template.  There are 2 fantastic posts you should read first.

  1. MVC 4 Authentication
  2. SimpleMembership, Membership Providers, Universal Providers and the new ASP.NET 4.5 Web Forms and ASP.NET MVC 4 templates

In addition, please check out Scott Allen’s excellent Pluralsight course called “Building Applications with ASP.NET MVC 4”.

MVC 4 Internet Template with pre-existing Domain Model

Create a new ASP.NET MVC 4 Internet Application and name it “SimpleMemberExample”

image

Custom Domain Model/Database

The first thing I want to do is create the custom domain model/database.  In the “Model” directory, lets add a class that represents our custom “User” table.  Lets call this custom user entity “Administrator” as seen here:

namespace SimpleMembershipExample.Models
{
    public class Administrator
    {
        public Administrator(){}
        #region Fields and Properties
        public int Id { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        #endregion
    }
}

(I was unable to figure out how my user table’s unique identifier could use a Guid.  I think the unique identifier of your custom user entity/table must be an int to use SimpleMembership.  anyone know?)

Lets add a custom DbContext as shown here to the root of the project.

using System.Data.Entity;
using SimpleMembershipExample.Models;

namespace SimpleMembershipExample
{
    public class SomeAppDbContext: DbContext
    {
        public SomeAppDbContext(): base(nameOrConnectionString: "SomeAppName"){}
        public DbSet<Administrator> Administrators { get; set; }
    }
}

The DbContext only contains a single table called Administrators just to keep this super duper easy.  Yours would contain lots more. Notice in the custom constructor, I am telling the DbContext to use a specific connection string.  Lets add that connection string to the Web.Config.

image

This connection string could be anything you want it to be.

Just for demo purposes, I am naming the database “SomeAppName”.  As a final step, in “Global.asax.cs”, put the following code:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        SomeAppDbContext dbcontext = new SomeAppDbContext();
        dbcontext.Administrators.All(i => i.Name != "Dan");

Running the application, the magical EF Code First will create the following database.  We have a custom database with a custom user table called “Administrators”.

image

Customizing MVC 4 Internet Template

Remove InitializeSimpleMembershipAttribute

The Internet template contains an Action filter called “InitializeSimpleMembershipAttribute”.  I deleted that class and removed any references to it.

Replace UserProfile with your Custom User Entity

The Internet template assumes that it will be adding a user table called “UserProfile” to your database.  What I think a high percentage of developers would want is to use their domain model’s “user” entity and have SimpleMembership just manage the passwords.  Let me demonstrate how to do this.

In the “Model” folder, in the “AccountModel.cs” file, delete the “UserProfile” class.  We want to use our “Administrator” entity instead.  Wherever UserProfile is referenced elsewhere, replace with Administrator.   The original UserProfile had properties called “UserName” and “UserId”.  Administrator has properties “Name” and “Id”.  Make sure to sync those properties up.

I want to have only 1 DbContext and I want to use my DbContext.  In the “Model” folder, in the “AccountModel.cs” file, delete the “UsersContext” class.  Wherever UsersContext is referenced elsewhere, replace with SomeAppDbContext.

Call WebSecurity.InitializeDatabaseConnection

As a final step, in “Global.asax.cs”, put the following code:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        SomeAppDbContext dbcontext = new SomeAppDbContext();
        dbcontext.Administrators.All(i => i.Name != "Dan");
        WebSecurity.InitializeDatabaseConnection("SomeAppName", 
            "Administrators", "Id", "Name", autoCreateTables: true);

WebSecurity.InitializeDatabaseConnection takes the web.config connection string name, the name of your custom user table (“Administrators”), the unique identifier field name of your user table (“Id”) and the user name field.  Running the InitializeDatabaseConnection method does several things:

  1. Initializes the static Roles and WebSecurity classes.
  2. Adds the following tables to your database: webpages_Membership, webpages_OAuthMembership, webpages_Roles, webpages_UsersInRoles, UserProfile.

Running the Internet Application

When you run the code with those changes, the following database is created:

image

The home screen looks like this:

image

Click on the Register link in the upper right.

image

Fill out the form and click the “Register” button.  The MVC 4 Internet template application will navigate you back to the home page.

image

Notice it knows the name you registered with.  If you check for cookies, you will see the typical ASPXAUTH as shown below.

image

If you click the “Log off” link and check cookies, the ASPXAUTH cookie disappears.  The ASPXAUTH cookie is the key to the authentication.

When you look at the database you will see the following:

image

Notice with the code changes, the MVC Internet template knew to save to the custom user table “Administrators”.  The password was saved to the webpages_Membership table with a foreign key relationship to the Administrators table.

Please download the code here.


2 Comments

Building a LOB Gamification Service Administration Website: Web API CRUD

At the end of the last post I had shown a high level overview of some data design patterns such as Repositories and Unit of Work and ended with the browser fetching data from the database for the Application entity of the domain model. In this post, I would like to discuss adding, deleting and updating data through the Web API.

Here is the fully coded ApplicationsController. Notice much of the code is simply delegating to the UoW which in turn simply delegates its work to the generic EFRepository.

clip_image001[1] Continue reading


2 Comments

LOB Gamification Service Admin Website: Data Services

At the end of the last post, I had a solution with multiple projects. One of the projects contained the POCO domain model and another project leveraged EF Code First to read/write the domain model to a dynamically created SQL Server database. The goal of this post is to use ASP.NET MVC Web API to surface database data to the client browser.

Most of my career I have spent on the server side of things moving data between layers. I have been part of teams where we created our own application infrastructure as well as a user of IdeaBlade’s DevForce, WCF RIA Services, CSLA, etc.

In the last year, I have had the pleasure of learning from Jon Sarker who is a senior software architect at ProModel. Jon has helped ProModel streamline moving data efficiently and quickly through the use of enterprise design patterns such as Repositories, Commanding, Factories (for repos and commands in particular), DTOs, Request/Response objects, etc. Once you understand and start using these data design patterns, everything seems so modular, clean and maintainable.

As I embarked on learning the new world of HTML5, JavaScript and Web API, I figured the learning materiel on the web would be the equivalent of showing me how to drag and drop a datasource control. That is why I was so blown away at the depth of John Papa’s course “Single Page Apps with HTML5, Web API, Knockout and jQuery”. From John’s blog, the SPA has lots of patterns “including the Repository Pattern (to expose the data in a consistent way), Unit of Work Pattern (to decouple the Web API from the lower layers and to aggregate the repositories), the Factory pattern (for creating repositories), and Single Responsibility Principle (SRP). The SRP is all throughout the client and server, in fact. Simply put, the patterns help make the app easier to debug, scale and maintain.” Continue reading

ClassDiagram


1 Comment

LOB Gamification Service Admin Website: Domain Model

In the last post about the LOB Gamification Service, the explanation of the video is a great starting point for defining the domain model I will be using.

“Every time the user crossed a lightning bolt Action, the user receives some points toward a Proficiency. A single Action might give points to multiple Proficiencies.  A single Proficiency can earn points through various ActionsProficiencies have different Levels.  As users earn points within a Proficiency, the user “levels up” that Proficiency.  Leveling up typically gives badges and other rewards.”

The words in bold are candidates for objects in the domain model.  Wikipedia defines Domain Model as “The domain model is created in order to represent the vocabulary and key concepts of the problem domain. The domain model also identifies the relationships among all the entities within the scope of the problem domain, and commonly identifies their attributes.”

Continue reading


1 Comment

Building a LOB Gamification Service Administration Website: Intro

Introduction

I received my Xbox 360 as a birthday gift from my wife in December 2005.  It has since become my all-time favorite console.  Besides Atari 2600, this is probably my most used console ever.  There are many reasons why I used this console more than any other and today I want to simply focus on just one reason referred to as Achievements.

Xbox 360 was unique to the console world at that time in that you “signed into” an account similar to how you sign into your iPhone or similar device.  The Xbox Live account had your gamer tag, an ever growing friends list and a thing called your Gamerscore.  From Wikipedia, “The Gamerscore (G) is an achievements system that measures the number of Achievement points accumulated by a user with a LIVE profile. These Achievement points are awarded for the completion of game-specific challenges, such as beating a level or amassing a specified number of wins against other players in online matches.”  “Achievements are included within games to extend the title’s longevity and provide players with the impetus to more than simply complete the game but find all of its secrets.”  (I added the bold formatting.)

Continue reading


1 Comment

ProModel Coroutines (prior to async/await pattern)

I asked my friend of many years, Terry Foster, to guess post for me on the subject of asynchronous programming.  Terry is the primary author of what we internally call the PAF:  ProModel Application Framework.  One of the features of the PAF is coroutines.  Below you will find Terry’s guest post.

Terry Foster

Terry Foster

It has become increasingly important, and even necessary in many cases, to employ asynchronous programming to improve application responsiveness.  However, the code often required to call asynchronous methods can quickly become convoluted and unmanageable.  The problem lies mainly in the need to provide some kind of handler method to be called when the asynchronous method has completed which prevents the developer from writing code in a straightforward, sequential manner, and instead causes the execution flow to jump around in a way that is typically very difficult to read and maintain.

Continue reading


Leave a comment

When Silverlight had an exciting future :-)

This was a blast to do.  Adam Kinney did a great job relaxing me.  Ward Bell and I met at a Starbucks prior to the video production and as always, I enjoyed his conversation and his knowledge in easily surfacing data to the client.

 

http://channel9.msdn.com/Blogs/AdamKinney/US-Army-using-Silverlight-for-Resourcing-Troops

 

Speaking of Ward Bell, I did an audio interview with him that you can find here.

 

http://www.ideablade.com/customers/success-stories/ProModelArmy/success_stories_ProModelArmy.aspx

 

The video just happened to go live while I was at Cedar Point with my family.  Being my first video, i was obsessed with seeing the # of views go up.  My wife was proud of me :-).


1 Comment

PluralSight Review

For the last 15 years, the primary means that I kept current was reading technical books.  You know the ones, 1000+ pages of pure reading bliss.  I loved being one of the first to buy and read a development book.  The anticipation of Amazon delivering it was terrible.  Good time, good times.

Over the last 5 years, ProModel has been blessed in needing to grow and I felt we needed to add some young hungry developers to keep us old developers honest.  Whereas I generally keep current through reading books, I have observed many younger developers rely more on videos over books to learn.   I love watching videos and have definitely incorporated videos into how I stay current; however, I still felt books were the only option to give me the depth that I desired.  Books generally have the “how to get started” chapter which walks me through setting up the development environment and another chapter dedicated to why the technology is better than the previous.  A 30 second video or even 5 minute video just left me wanting more.

The primary architecture of ProModel web applications rely on Silverlight for the presentation.   Like many development shops who invested in Silverlight, ProModel is researching technology options for the presentations of future products and/or existing products.  MVVM is a design pattern that I have fallen in love with and I was hoping there existed something similar in the JavaScript world.  Low and behold, John Papa’s blog introduced me to Knockout.js.  I quickly burned through the short tutorials and videos and desired something with more depth.  Unfortunately, there we no published books on HTML5 and Knockout.js.  Searching the web, I discovered PluralSight offered the video course “Building HTML5 and JavaScript Apps with MVVM and Knockout”, but, my skepticism prevented me from signing up.  They offered a 200 minute trial so I gave it a try.

I was blown away at the depth and the increase in learning.  Watching someone talk and code in Visual Studio complemented with a presentation is very effective.  I personally download the code and follow along side by side.

Since subscribing to PluralSight, for the first time, I desire video over book.  PluralSight is amazing.  Continue reading

Follow

Get every new post delivered to your Inbox.

Join 446 other followers