Skip to content

Provide tooling for working with URI Templates #4

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());
        }
    }
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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