Mo Mapping, Mo Problems
A few weeks ago I wrote an article about my new Umbraco mapping engine UmbMapper. If you haven't read that post please do, and better yet, please download it and give it a try.
There's been a longstanding puzzle I've been trying to solve for a while now with mapping engines. One that I couldn't crack with Ditto and until today I didn't think I could solve it with UmbMapper.
I was wrong :)
The Problem
Consider the following POCO class.
public class Page {
public string Name { get; set; }
public string Slug => this.Name.ToUrlSegment();
}
Mapping this kind of class is impossible with conventional reflection-based run-time mappers as there is no way to guarantee that the Name
property has a value. You'll get a NullReferenceException
and a whole heap of frustration.
You can workaround this with Umbraco but it's not pretty. You could either
- Turn
Slug
into a method which works but makes it impossible to serialize. - Create an event handler to calculate and store the property when saving the doctype. This is oh-so-ugly and means spreading logic all over the place.
The Solution
With UmbMapper you can map these properties in the following manner.
First let's define our class.
public class Page {
public string Name { get; set; }
public string Slug { get; set; }
}
And our mapper.
public class PageMap : MapperConfig<Page>
{
public PageMap()
{
this.AddMap(p => p.Name);
this.AddMap(p => p.Slug).MapFromInstance(i => i.Name.ToUrlSlug());
}
}
The MapFromInstance
method is our friend here. This has the following signature.
/// <summary>
/// Sets the property mapping predicate. Used for mapping from known values in the current instance.
/// </summary>
/// <param name="predicate">The mapping predicate</param>
/// <returns>The <see cref="PropertyMap{T}"/></returns>
public PropertyMap<T> MapFromInstance(Func<T, object> predicate)
With this method we can map any combination of lazy/non-lazy properties at run-time and be guaranteed the correct result and we keep our mapping logic where it belongs.
Fantastic!
Get it While it's Hot!
Give UmbMapper a whirl, it's simple to use but immensely powerful giving you the means to create flexible, scalable Umbraco websites with very little effort.