Get your Umbraco data in strongly typed models
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
uTyped
.gitignore
.travis.yml
LICENSE
README.md
uTyped.sln

README.md

Build Status NuGet

This package helps you get read access to your Umbraco data in strongly typed models.
This can be useful when you need to returns some of your content through an API controller for example.

Get the package

You can install the package from nuget using the following command in the Package Manager Console:

Install-Package uTyped

Using the default mapping

The easiest and quickest way to get setup is to use AutoMapper (this library is already installed with Umbraco).
You will have to create your Models first. For example:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string ShortName { get; set; }
}

And then once the application has started, you can add the AutoMapper configuration:

protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
    //Initialize AutoMapper
    Mapper.AddProfile<UmbracoProfile<Product>>();
    
    // Do not use the following line because it might break your back office:
    // Mapper.Initialize(cfg => cfg.AddProfile<UmbracoProfile<Product>>());
}

We are using a profile in this example but this isn't mandatory. You could as well create your map and add the resolver for all properties:

protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
    //Initialize AutoMapper
	Mapper.CreateMap<IPublishedContent, Product>()
		.ForAllMembers(opt => opt.ResolveUsing<PropertyResolver>());
}

Once the setup is done, you can access your data from your controller:

public class MyController : UmbracoApiController
{
    private readonly UmbracoRepository _repo;

    public TestController()
    {
        _repo = new UmbracoRepository(Umbraco);
    }

    public IEnumerable<Product> GetAll()
    {
        return _repo.GetAll<Product>();
    }

    public Product Get(int id)
    {
        return _repo.GetById<Product>(id);
    }
}

Now if you go to http://yourwebsite/umbraco/api/test/getall you should be able to see all your products.

More information

By default, _repo.GetAll<T>() creates the xPath using the name of the class. If your data is nested, you can pass a different xPath:

public IEnumerable<Product> GetAll()
{
	return _repo.GetAll<Product>("//Data/Products");
}

Using a different mapping

All the methods can take a custom Func<IPublishedContent, T>() to allow you to skip AutoMapper if you feel like it.

Resolvers

We've added a bunch of resolvers we often use to help you.
For example, if your product Model is upgraded to:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string ShortName { get; set; }
    public string[] Images { get; set; }
}

You will have to use the MultiMediaResolver for the Images property.
Using the AutoMapper profile:

public class ProductProfile : UmbracoProfile<Product>
{
    private readonly UmbracoHelper _umbracoHelper;

    public ProductProfile(UmbracoHelper umbracoHelper)
    {
        _umbracoHelper = umbracoHelper;
    }

    protected override void Configure()
    {
        Mapper.CreateMap<IPublishedContent, Product>()
            .ForMember(dest => dest.Images, opt => opt.ResolveUsing(new MultiMediaResolver(_umbracoHelper)));

        base.Configure();
    }
}

And once again initialize AutoMapper:

protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
    //Initialize AutoMapper
    Mapper.AddProfile<ProductProfile>();
}