Skip to content

Provide tooling for working with URI Templates #4

@tpluscode

Description

@tpluscode

Currently there is no concrete way to simplify how URI Templates are used throughout a Hydra application.

First, they are used as create resource identifiers for serialized objects. Currently the only way is to manually use a URI Template to construct the identifier

public class MyModel 
{
    public Uri Id { get; set; }
}

var model = new MyModel();
var template = new UriTemplate("path/{name}{?includeSub}");
model.Id = template.BindByName(new Dictionary<string, object>
{
    { "name", "guid" },
    { "includeSub", true }
});

Second, the very same template could be used for routing in Nancy. It is what I started implementing in Nancy.Routing.UriTemplates

public class MyModelModule : UriTemplateModule 
{
    public MyModelModule()
    {
        using (Templates)
        {
            Get("path/{name}{?includeSub}", _ => new MyModel());
        }
    }
}

By introducing a pattern similar to ServiceStack routing, where routing is part of the model it should be possible to simplify handling of URI Templates for routing and creating identifiers.

Something like

[IdentifierTemplate("path/{name}{?includeSub}")]
public class MyModel 
{
    public Uri Id { get; set; }

    public string Name { get; set; }
}

var model = new MyModel { Name = "Tomasz" };
model.Id = model.BindTemplate(new { includeSub = true });

The BindTemplate would be an extension which looks for IdentifierTemplateAttribute on given instance's type and uses passed params and/or property values to fill in the template.

And finally, the route path wouldn't be needed at all in module

// ArgolisModule inheriting UriTemplateModule
public class MyModelModule : ArgolisModule
{
    public MyModelModule()
    {
        using (Templates)
        {
            Get<MyModel>(_ => new MyModel());
        }
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions