ServiceStack v4.0.09

Rabbit MQ Support

The biggest feature in this release is ServiceStack's new support for hosting Services via a Rabbit MQ Server, expanding on our existing Redis MQ and In Memory messaging options with a new durable MQ option in the robust and popular Rabbit MQ. ServiceStack's Rabbit MQ support is available on NuGet with:

PM> Install-Package ServiceStack.RabbitMq

A new Rabbit MQ on Windows installation and setup guide was published containing code samples for working with Rabbit MQ from C#/.NET.

Configurable Metadata Pages

New customizable filters were added to the MetadataFeature plugin to allow customization of the Master and detail metadata pages before they're rendered. E.g. you can reverse the order of operation names with:

var metadata = (MetadataFeature)Plugins.First(x => x is MetadataFeature);
metadata.IndexPageFilter = page => {
    page.OperationNames.Sort((x,y) => y.CompareTo(x));
};

OrmLite new runtime typed API

The IUntypedApi interface is useful for when you only have access to a late-bound object runtime type which is accessible via db.CreateTypedApi, e.g:

public class BaseClass
{
    public int Id { get; set; }
}

public class Target : BaseClass
{
    public string Name { get; set; }
}

var row = (BaseClass)new Target { Id = 1, Name = "Foo" };

var useType = row.GetType();
var typedApi = db.CreateTypedApi(useType);

db.DropAndCreateTables(useType);

typedApi.Save(row);

var typedRow = db.SingleById<Target>(1);
typedRow.Name //= Foo

var updateRow = (BaseClass)new Target { Id = 1, Name = "Bar" };

typedApi.Update(updateRow);

typedRow = db.SingleById<Target>(1);
typedRow.Name //= Bar

typedApi.Delete(typedRow, new { Id = 1 });

typedRow = db.SingleById<Target>(1); //= null

OrmLite Create Table Support

  • Added NonClustered and Clustered options to [Index] attribute

Breaking changes

Messaging

In order to support Rabbit MQ Server some changes were made to ServiceStack's Messaging API to support all MQ options, namely:

  • IMessageQueueClient now exposes high-level IMessage API's instead of raw byte[]
  • The IMessage.Error property is now a ResponseStatus type (same used in Web Services)
  • Ack / Nak APIs were also added to IMessageQueueClient
  • All MQ Brokers now have a default RetryCount=1

ServiceStack.Text

  • UrlEncode extension method now encodes spaces with + instead of %20 to match default HttpUtility.UrlEncode behavior

OrmLite

  • MySql and Sqlite providers now treat GUID's as char(36)