Skip to content

Instantly share code, notes, and snippets.

@lydonchandra
Created July 8, 2020 19:00
Show Gist options
  • Save lydonchandra/dbfac511ac0dd526f90e92975ccf3213 to your computer and use it in GitHub Desktop.
Save lydonchandra/dbfac511ac0dd526f90e92975ccf3213 to your computer and use it in GitHub Desktop.
OData V4.0 ComplexType Serialization Test
using Microsoft.OData;
using Microsoft.OData.Edm;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace ConsoleApp1
{
class Program
{
static void Main( string[] args )
{
const string Namespace = "DonNamespace";
var model = new EdmModel();
var container = new EdmEntityContainer(Namespace, "container");
model.AddElement( container );
var addressType = new EdmComplexType(Namespace, "Address");
addressType.AddStructuralProperty( "StreetName", EdmPrimitiveTypeKind.String );
addressType.AddStructuralProperty( "PostCode", EdmPrimitiveTypeKind.Int32 );
model.AddElement( addressType );
var personType = new EdmEntityType(Namespace, "Person" );
var usernameProp = personType.AddStructuralProperty( "Username", EdmPrimitiveTypeKind.String );
personType.AddKeys( usernameProp );
personType.AddStructuralProperty( "Fullname", EdmPrimitiveTypeKind.String );
personType.AddStructuralProperty( "Address", new EdmComplexTypeReference( addressType, isNullable: false ) );
model.AddElement( personType );
var personSet = container.AddEntitySet( "Person", personType );
var memStream = new MemoryStream();
var settings = new ODataMessageWriterSettings()
{
ODataUri = new ODataUri()
{
ServiceRoot = new Uri("https://services.odata.org/V4/OData/OData.svc/")
}
};
var message = new InMemoryMessage()
{
Stream = memStream
};
var odataWriter = new ODataMessageWriter( (IODataResponseMessage)message, settings, model );
var resoWriter = odataWriter.CreateODataResourceWriter( personSet );
var person = new ODataResource
{
Properties = new []
{
new ODataProperty() { Name = "Username", Value = "don1" }
}
};
var address = new ODataResource
{
Properties = new []
{
new ODataProperty() { Name = "StreetName", Value = "Photonic Ray" },
new ODataProperty() { Name = "PostCode", Value = 6543 }
}
};
var nestedInfo = new ODataNestedResourceInfo()
{
Name = "Address"
,
IsCollection = false
};
resoWriter.WriteStart( person );
resoWriter.WriteStart( nestedInfo );
resoWriter.WriteStart( address );
resoWriter.WriteEnd();
resoWriter.WriteEnd();
resoWriter.WriteEnd();
Console.Write(
Encoding.UTF8.GetString( memStream.ToArray() )
);
Console.Read();
}
}
public class InMemoryMessage : IODataRequestMessage, IODataResponseMessage, IContainerProvider, IDisposable
{
private readonly Dictionary<string, string> headers;
public InMemoryMessage()
{
headers = new Dictionary<string, string>();
}
public IEnumerable<KeyValuePair<string, string>> Headers
{
get { return this.headers; }
}
public int StatusCode { get; set; }
public Uri Url { get; set; }
public string Method { get; set; }
public Stream Stream { get; set; }
public IServiceProvider Container { get; set; }
public string GetHeader( string headerName )
{
string headerValue;
return this.headers.TryGetValue( headerName, out headerValue ) ? headerValue : null;
}
public void SetHeader( string headerName, string headerValue )
{
headers[ headerName ] = headerValue;
}
public Stream GetStream()
{
return this.Stream;
}
public Action DisposeAction { get; set; }
void IDisposable.Dispose()
{
if ( this.DisposeAction != null )
{
this.DisposeAction();
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment