Posts tagged ‘Continuous Improvement’

Extension Methods: Improving the quality of Life


Extension methods, such a simple idea that can totally make the small things in your application or at least the un-DRY portions of it cleaner.

AddModelError and Multiple ValidationResults

Here is a simple example (taken from a custom model binder):

foreach( var validationResult in validationResults )
{
  bindingContext.ModelState
    .AddModelError( validationResult.MemberNames.FirstOrDefault(), validationResult.ErrorMessage );
}

not too bad, but when working in a block of code where you might have a few instances of it you tend to see the noise a little bit.

How about a little reduction and also centralize some logic so your entire code base can leverage it?

bindingContext.ModelState.AddModelErrors(validationResults);

Now that everything you thought was upright in the world is all in question, ok, not really – not even close. In fact we’ve only saved three lines of code where such things are being used but I would argue if you try to keep small things like this in mind that over time your code base will start to reap the benefits.

Here is how I implemented the extension method. Your mileage may vary.

public static class ModelStateExtensions
{
    public static void AddModelErrors(this ModelStateDictionary values, IEnumerable<ValidationResult> validationResults)
    {
        foreach (var validationResult in validationResults)
            values.AddModelError(validationResult.MemberNames.FirstOrDefault(), validationResult.ErrorMessage);
    }
}
DataAnnotations and the Validator class

Another area that might not be Asp.net MVC specific is if you are using the DataAnnotaions directly on your models and you use the static Validator class to validation the model. In this case the TryValidateObject is being used for the bool that is returned from the operation.

ValidationContext validationContext = new ValidationContext( someEditModel, null, null );
List<ValidationResult> validationResults = new List<ValidationResult>();
bool isValid = Validator.TryValidateObject( someEditModel, validationContext, validationResults );
if( !isValid )
{
  //do something maybe ...
  bindingContext.ModelState.AddModelErrors(validationResults);
}

I think I prefer this a little more

List<ValidationResult> validationResults = someEditModel.ValidateAnnotations();
if( validationResults.Count() > 0 )
  bindingContext.ModelState.AddModelErrors(validationResults);

Where ValidateAnnotations is implemented as follows. Also you if you prefer to change the where this can be used you can change the accessibility or change what this method extends to limit it’s exposure.

public static class ValidationExtensions
{
    public static List<ValidationResult> ValidateAnnotations<T>(this T value) where T : class
    {
        if(value == null) return new List<ValidationResult>();

        var validationContext = new ValidationContext(value, null, null);
        var validationResults = new List<ValidationResult>();
        Validator.TryValidateObject(value, validationContext, validationResults, true);
        return validationResults;
    }
}

Hopefully these two little nuggets will help someone out. Both of these are just a means to end, where I think that end is a transformation to a code base even beyond simple changes like this. After all it is all about the journey not the destination.

C4MVC: Reason #42 to Join

What is C4MVC?  Well per the about us page it is:

Our Vision is to share knowledge and best practices around using the framework, as well as encourage community contributions that serve the greater good.

Through interactive sessions, projects, and aggregated blog feeds we hope to provide:

  • A way for new developers to use the framework the right way.
  • Techniques and tools to allow experienced developers to develop with less friction.
  • A self supporting community.

Per my definition:

A virtual user group on Wednesday mornings where I can listen in on the Asp.Net MVC big guns discuss the topic of the framework that I need to learn better.


Besides the great free content such as last weeks Advanced MVC2 topic sometimes, just sometimes, you can win some stuff.  In my case, I loves me some 30 day subscription to TekPub which also happens to have a lengthy Asp.NET MVC series. Now the only problem I have is finding the correct window to pull the pin this content grenade so that I can put together 30 days of face melting guitar solo mind melding content assimilation.  Parent of 3 (4 and under) makes that a GTD challenge.

The C4MVC.NET (google) group is open to anyone to join so come and join the group to get some good nuggets of Asp.net MVC knowledge on!  No really, join now!

Unit Testing, Just Do It!

I used to be the ConsoleApplication132 type of developer and no big surprise my projects didn’t have any unit tests in them, if any at all.  To try and remedy this I took a 3 week TestProject1 challenge.  Instead of doing quick spikes to a .NET console application to ‘try something out’ I spun up a Test Project.

bell

So where am I now?  Well my stuff has tests, but I’m in some bell curve of using Mocks improperly and over specifying my tests.  I really like the naming style of BDD but flirted around with class name test method convention is about as deep as I have got into that realm so far.

… to be continued … over many years, I’m sure …