Using StructureMap with ASP.NET MVC & MVC Contrib

Iā€™ve found myself using the MVC Contrib project more and more lately. There are tons of golden framework nuggets just waiting to be used.

I recently integrated StructureMap into the my current ASP.NET MVC framework using MVC Contrib. The reason I decided to write this post is because most of the resources I found on the internet appeared to be a little out of date and used deprecated StructureMap APIs. So, here it goesā€¦

Note: The following examples are using StructureMap v2.5.3 & ASP.NET MVC v2 Preview 1 & MVC Contrib MVC2 Branch code bits. You may find minor differences in API &| syntax if you are using a different version.

First lets investigate why StructureMap is necessary in the first place. You can find some good blog posts by Jeremy D. Miller about the basics of the Dependency Injection Pattern and using an IOC tool.

In order to facilitate mocking and decouple our application we pass an interface of our service into our controller instead of a concrete class. The default controller factory that ASP.NET MVC uses requires a default constructor to be present, but we are going to define our own Controller Factory later in this post using one of the MVC Contrib classes.

Note: There is actually a really good screencast with @robconery and @jeremydmiller about using StructureMap in ASP.NET MVC. There were several ā€œAha!ā€ moments for me as I watched it. The StructureMap API has changed slightly since the screencast, but I will show the updated syntax in the following of this post.

The following is a typical ContactController class that will house the Index, Details, Create, Edit, and Delete actions. You will notice that instead of having a default constructor, I have an overloaded contructor and am passing in an interface to my service. I will wire up StructureMap to handle passing in the appropriate object later in this post.

public partial class ContactController : Controller
{
private IContactService service;

public ContactController(IContactService service)
{
this.service = service;
}
}

The wiring part, happens typically in the Application_Start event from the Global.asax.cs file. In addition to Registering your MVC routes (which should have already been wired up when you created your MVC application) you need to both configure StuctureMap to know what concrete classes map to what interfaces as well as tell MVC to use StructureMap to create its controllers.

public class Global : HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);

Bootstrapper.ConfigureStructureMap();
ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
}
}

I am going to attempt and explain the above code snippet line by line, so lets start with the Bootstrapper.ConfigureStructureMap() and then we will discuss the StructureMapControllerFactory().

After everything is said and done, the important part of StructureMap is that it knows what interfaces should map to what concrete types so that it can inject the appropriate instances at runtime. This is where the Bootstrapper.ConfigureStructureMap() comes into play.

public static class Bootstrapper 
{
public static void ConfigureStructureMap()
{
ObjectFactory.Initialize(x => x.AddRegistry(new MyApplicationRegistry()));
}
}

public class MyApplicationRegistry : Registry
{
public MyApplicationRegistry()
{
Scan(assemblyScanner =>
{
assemblyScanner.TheCallingAssembly();
assemblyScanner.WithDefaultConventions();
});
}
}

The above code is initializing StructureMap with the MyApplicationRegistry that contains the rules for the interface & concrete type mappings. You may be wondering, ā€œBut I donā€™t see where IContactService is mapped to ContactServiceā€ and that is a very good question. The answer is that StuctureMap takes the Convention Over Configuration approach and tries to take some educational guesses based on a set of default naming conventions.

Lets say that your configuration isnā€™t following standard naming conventions. Can you still use StructureMap? Well, of course you can :) You have full control over the mappings and can set them up however you wish. The following is an example of me manually doing the mapping instead of using the default naming conventions. The Bootstrapper remains the same, so I only will show the code that is different belowā€¦

public class MyApplicationRegistry : Registry
{
public MyApplicationRegistry()
{
ForRequestedType().TheDefaultIsConcreteType();
ForRequestedType().TheDefaultIsConcreteType();
}
}</pre>

Now lets focus on the StructureMapControllerFactory that we saw after we Configured StructureMap from the Global.asax. The StructureMapControllerFactory class that I am instantiating actually comes with the MVC Contrib project.Ā  The contents of this class isnā€™t really all that complicated, but its one less thing you have to write by hand. The following is an example of a oversimplified implementation of the StructureMapControllerFactory that you could write yourselfā€¦

public class StructureMapControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
return ObjectFactory.GetInstance(controllerType) as IController;
}
}

Since we separated our dependencies and used StructureMap for injection our application is now loosely coupled and our ability to Unit Test more areas has increased.

Stay tuned for a new series where I will upgrade a standard ASP.NET MVC project to ASP.NET MVC 2 and then integrate StructureMap, Moq, MbUnit, and suite of Unit Tests.

Read More »

ASP.NET AJAX Add-ons (FireAtlas & FireCookie) for Firefox's Firebug

Todayā€™s screencast is the 4th in a series of developer Firefox Extensions. You can view my previous 3 short Screenr screencasts hereā€¦

For those of you that do ASP.NET or ASP.NET AJAX development, then the following Firebug Add-ons might be of interest to you.

FireAtlas is a tool that enables you to view the PageRequestManager events, trace WebService calls, inspect Partial Updates, and view any installed application components. You can actually try out some samples pages to exercise most of the functionality of this Add-on, but I will be viewing the twitter scheduler application TwtMstr (developed by @wbm) to demonstrate some of the features in my screencast.

FireCookie is another useful tool that allows you to view any cookies that are relevant for the current web page. This can be handy for an ASP.NET developer to inspect the .ASPXROLES, .ASPXAUTH, or ASP.NET_SessionId values that are common for most ASP.NET applications.

Ā 

Yet again, I hope this was beneficial to you. If you enjoyed the presentation I would appreciate either a comment to this blog &| a tweet about it to share with others.

"#ASPNET #AJAX Add-ons (FireAtlas & FireCookie) for #Firefox's #Firebug" by @elijahmanor #tech #nettuts #screencast http://j.mp/111ZQO

Also, if you have any suggestions that you have to help become a better presenter I would appreciate that as well. If you have a minute, please add a comment with your thoughts.

Read More »

Reasons Why .NET Developers Love Their MacBook Pros

Initial Questionnaire

I recently posted an informal survey asking .NET Developers why they love their MacBook Pros and I want to thanks the 51 individuals who responded to my survey.

Objective Results

The first four questions (other than name, twitter, etcā€¦) were general questions about their MacBook Pro hardware. Those types of questions are easy and quick to graph.

Note: If you see some discrepancies of the numbers please note that shortly after I first submitted the questionnaire I added the hardware questions. So, the first several people who answered the survey didnā€™t have those questions.

Reasons You Love your MacBook Pro for .NET Development

As to summarize the above charts, it seems that most of the people who responded to the survey were .NET developers using a MacBook Pro with a 2.66MHz Processor, 4 GB RAM, and a 15 inch monitor.

Subjective Results

Well, objectively that is all I can really graph. The rest of the questions allowed free form text, which is difficult to chart :) however, I did attempt to summarize each question into common answers so that I can graph them. So, here are my findingsā€¦

WhyDidSwitchFromPcToMac

So it seems that the majority of those that switched did so because they had the opportunity to run both OSX and Windows, they felt the hardware was better (faster & quality), and they thought it was more stylish :)

WouldYouConsiderMovingBackToPc

Of those that have switched from a PC to a Mac the vast majority (64%) said that they would not switch back to the PC and only a handful were adamant about moving back to the PC.

AreThereFeaturesThatTheMacHasThatThePcDoesnt

Mac users feel that their OS is more usable and simple compared to Windows, they feel the software for OSX is better, is more stable, and it was mentioned over and over that the multitouch trackpad on the Mac is a plus!

DoYouFindYouAreSacrificingPerformanceByUsingTheMac

An overwhelming majority of Mac users feel that they are no sacrificing any performance by using the Mac. Of those that did feel they were lacking some performance, they attibuted it to using a VM (VMWare or Parallels) and recommending using Bootcamp instead.

AnythingElseIShouldKnowBeforeIChange

As a last ditch effort to glean any useful information, I asked if there was anything else I needed to know before I made the change to a Mac. A large portion of the responses encouraged me to purchase VM software (VMWare or Parrallels), reprogram my keyboard for the PC, and to buy as much of RAM as possible.

Conclusion

Overall, I am very pleased with the responses of the questionnaire. I am even more inclined to make the switch myself. Only time will tell if this will actually take place, but I do appreciate you humoring me in this research and Iā€™m sure you will know when and/or if I do take the Mac plunge for .NET development :)

Read More »

Page Speed & YSlow Firebug Extensions to Increase Web Page Performance

Todayā€™s screencast is the 3rd in a series of developer Firefox Extensions. You can view my previous 2 short Screenr screencasts hereā€¦

You will most likely be asked to speed up the performance of some web page whether it be your corporate, personal, or some other web page. There are so many things that can cause a web page to be perceived as slow that it is helpful to have a tool to give you a guideline of where to start.Ā 

Fortunately, there are two great tools for the Firebug Add-on for Firefox that do performance checking of any given web page. The tools we will be looking at in the following screencast are Googleā€™s Page Speed and Yahooā€™s YSlow Add-ons.

Ā 

Yet again, I hope this was beneficial to you. If you enjoyed the presentation I would appreciate either a comment to this blog &| a tweet about it to share with others.

"Page Speed & YSlow Firebug Extensions 2 Increase Web Page Performance" by @elijahmanor #tech #nettuts #webdev #screencast http://j.mp/7IFWJ

Also, if you have any suggestions that you have to help become a better presenter I would appreciate that as well. If you have a minute, please add a comment with your thoughts.

Read More »

Digging Into The FireQuery Add-on for jQuery

Yesterday I posted my first short Screenr screencast

Today I decided to record another screencast, and I decided to dig into the FireQuery add-on for Firebug.

FireQuery adds extra functionality to the HTML tab and allows you to visually see embedded data elements and event handlers that were added via jQuery. Also, the familiar jQuerify Bookmarklet has been built into Firebug allowing you to inject jQuery into pages that didnā€™t have it installed previously. This enables you to play around with jQuery or extract information for a webpage that might not previously have jQuery installed.

Ā 

Yet again, I hope this was beneficial to you. If you enjoyed the presentation I would appreciate either a comment to this blog &| a tweet about it to share with others.

"Digging into the FireQuery Add-on for jQuery" by @elijahmanor #tech #nettuts #jquery #screencast http://j.mp/1T9RKE

Also, if you have any suggestions that you have to help become a better presenter I would appreciate that as well. If you have a minute, please add a comment with your thoughts.

Read More »