Removing formatters

This commit is contained in:
moozzyk 2016-10-11 17:55:36 -07:00
parent a854b13754
commit fd10deba6c
7 changed files with 18 additions and 90 deletions

View File

@ -63,7 +63,7 @@ namespace SocketsSample
foreach (var connection in _endPoint.Connections) foreach (var connection in _endPoint.Connections)
{ {
var invocationAdapter = _endPoint._serviceProvider.GetRequiredService<SocketFormatters>() var invocationAdapter = _endPoint._serviceProvider.GetRequiredService<InvocationAdapterRegistry>()
.GetInvocationAdapter((string)connection.Metadata["formatType"]); .GetInvocationAdapter((string)connection.Metadata["formatType"]);
tasks.Add(invocationAdapter.InvokeClientMethod(connection.Channel.GetStream(), message)); tasks.Add(invocationAdapter.InvokeClientMethod(connection.Channel.GetStream(), message));
@ -88,7 +88,7 @@ namespace SocketsSample
{ {
var connection = _endPoint.Connections[_connectionId]; var connection = _endPoint.Connections[_connectionId];
var invocationAdapter = _endPoint._serviceProvider.GetRequiredService<SocketFormatters>() var invocationAdapter = _endPoint._serviceProvider.GetRequiredService<InvocationAdapterRegistry>()
.GetInvocationAdapter((string)connection.Metadata["formatType"]); .GetInvocationAdapter((string)connection.Metadata["formatType"]);
if (_endPoint._logger.IsEnabled(LogLevel.Debug)) if (_endPoint._logger.IsEnabled(LogLevel.Debug))

View File

@ -44,13 +44,8 @@ namespace SocketsSample
// TODO: Dispatch from the caller // TODO: Dispatch from the caller
await Task.Yield(); await Task.Yield();
/*
var formatter = _serviceProvider.GetRequiredService<SocketFormatters>()
.GetFormatter<InvocationDescriptor>((string)connection.Metadata["formatType"]);
*/
var stream = connection.Channel.GetStream(); var stream = connection.Channel.GetStream();
var invocationAdapter = _serviceProvider.GetRequiredService<SocketFormatters>() var invocationAdapter = _serviceProvider.GetRequiredService<InvocationAdapterRegistry>()
.GetInvocationAdapter((string)connection.Metadata["formatType"]); .GetInvocationAdapter((string)connection.Metadata["formatType"]);
while (true) while (true)

View File

@ -1,41 +1,31 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Sockets;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace SocketsSample namespace SocketsSample
{ {
public static class FormatterExtensions public static class RpcExtensions
{ {
public static IApplicationBuilder UseFormatters(this IApplicationBuilder app, Action<FormatterBuilder> registerFormatters) public static IApplicationBuilder UseRpc(this IApplicationBuilder app, Action<RpcBuilder> registerAdapters)
{ {
var formatters = app.ApplicationServices.GetRequiredService<SocketFormatters>(); var adapters = app.ApplicationServices.GetRequiredService<InvocationAdapterRegistry>();
registerFormatters(new FormatterBuilder(formatters)); registerAdapters(new RpcBuilder(adapters));
return app; return app;
} }
} }
public class FormatterBuilder public class RpcBuilder
{ {
private SocketFormatters _socketFormatters; private InvocationAdapterRegistry _invocationAdapters;
public FormatterBuilder(SocketFormatters socketFormatters) public RpcBuilder(InvocationAdapterRegistry invocationAdapters)
{ {
_socketFormatters = socketFormatters; _invocationAdapters = invocationAdapters;
}
public void MapFormatter<T, TFormatterType>(string format)
where TFormatterType : IFormatter<T>
{
_socketFormatters.RegisterFormatter<T, TFormatterType>(format);
} }
public void AddInvocationAdapter(string format, IInvocationAdapter adapter) public void AddInvocationAdapter(string format, IInvocationAdapter adapter)
{ {
_socketFormatters.RegisterInvocationAdapter(format, adapter); _invocationAdapters.RegisterInvocationAdapter(format, adapter);
} }
} }
} }

View File

@ -1,12 +0,0 @@
using System.IO;
using System.Threading.Tasks;
namespace SocketsSample
{
// TODO: Is this name too generic?
public interface IFormatter<T>
{
Task<T> ReadAsync(Stream stream);
Task WriteAsync(T value, Stream stream);
}
}

View File

@ -5,43 +5,10 @@ using Microsoft.Extensions.DependencyInjection;
namespace SocketsSample namespace SocketsSample
{ {
public class SocketFormatters public class InvocationAdapterRegistry
{ {
private IServiceProvider _serviceProvider;
private Dictionary<string, Dictionary<Type, Type>> _formatters = new Dictionary<string, Dictionary<Type, Type>>();
private Dictionary<string, IInvocationAdapter> _invocationAdapters = new Dictionary<string, IInvocationAdapter>(); private Dictionary<string, IInvocationAdapter> _invocationAdapters = new Dictionary<string, IInvocationAdapter>();
public SocketFormatters(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public void RegisterFormatter<T, TFormatterType>(string format)
where TFormatterType : IFormatter<T>
{
Dictionary<Type, Type> formatFormatters;
if (!_formatters.TryGetValue(format, out formatFormatters))
{
formatFormatters = _formatters[format] = new Dictionary<Type, Type>();
}
formatFormatters[typeof(T)] = typeof(TFormatterType);
}
public IFormatter<T> GetFormatter<T>(string format)
{
Dictionary<Type, Type> formatters;
Type targetFormatterType;
if (_formatters.TryGetValue(format, out formatters) && formatters.TryGetValue(typeof(T), out targetFormatterType))
{
return (IFormatter<T>)_serviceProvider.GetRequiredService(targetFormatterType);
}
return null;
// throw new InvalidOperationException($"No formatter register for format '{format}' and type '{typeof(T).GetType().FullName}'");
}
public void RegisterInvocationAdapter(string format, IInvocationAdapter adapter) public void RegisterInvocationAdapter(string format, IInvocationAdapter adapter)
{ {
_invocationAdapters[format] = adapter; _invocationAdapters[format] = adapter;

View File

@ -21,7 +21,7 @@ namespace SocketsSample
services.AddSingleton<ChatEndPoint>(); services.AddSingleton<ChatEndPoint>();
services.AddSingleton<ProtobufSerializer>(); services.AddSingleton<ProtobufSerializer>();
services.AddSingleton<SocketFormatters>(); services.AddSingleton<InvocationAdapterRegistry>();
} }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
@ -44,11 +44,11 @@ namespace SocketsSample
routes.MapSocketEndpoint<RpcEndpoint>("/jsonrpc"); routes.MapSocketEndpoint<RpcEndpoint>("/jsonrpc");
}); });
app.UseFormatters(formatters=> app.UseRpc(invocationAdapters =>
{ {
formatters.AddInvocationAdapter("protobuf", new Protobuf.ProtobufInvocationAdapter(app.ApplicationServices)); invocationAdapters.AddInvocationAdapter("protobuf", new Protobuf.ProtobufInvocationAdapter(app.ApplicationServices));
formatters.AddInvocationAdapter("json", new JSonInvocationAdapter()); invocationAdapters.AddInvocationAdapter("json", new JSonInvocationAdapter());
formatters.AddInvocationAdapter("line", new LineInvocationAdapter()); invocationAdapters.AddInvocationAdapter("line", new LineInvocationAdapter());
}); });
} }
} }

View File

@ -1,12 +0,0 @@
using System.IO;
using System.Threading.Tasks;
namespace Microsoft.AspNetCore.Sockets
{
// TODO: Is this name too generic?
public interface IFormatter<T>
{
Task<T> ReadAsync(Stream stream);
Task WriteAsync(T value, Stream stream);
}
}