Web services 提供接口实现而不是数据的服务
从一段时间以来,只要有可能,我就用ServiceStack(或WebAPI)而不是WCF实现服务 我现在要做的是向服务器发送一个接口(-name),并返回一个类实现。也许这让人困惑,所以我给你举个例子: 我的服务客户端有多个操作,如“检查表单”: 未实现检查此表单的逻辑。它有一个名为Web services 提供接口实现而不是数据的服务,web-services,interface,
servicestack,Web Services,Interface,
servicestack,从一段时间以来,只要有可能,我就用ServiceStack(或WebAPI)而不是WCF实现服务 我现在要做的是向服务器发送一个接口(-name),并返回一个类实现。也许这让人困惑,所以我给你举个例子: 我的服务客户端有多个操作,如“检查表单”: 未实现检查此表单的逻辑。它有一个名为ifformchecker的接口,使用NameIsValid(stringfirstname、stringmiddlename、stringlastname)等方法 客户端将从服务器请求实现IFormChecker,
ifformchecker
的接口,使用NameIsValid(stringfirstname、stringmiddlename、stringlastname)
等方法
客户端将从服务器请求实现IFormChecker
,而不是将整个表单数据发送到服务器进行验证
我知道WCF可以做到这一点,但我不知道如何使用ServiceStack做到这一点。
如果可能的话,怎么办?我查看了文档,但我并不是真的更聪明。看起来好像没有“魔术”之类的东西。
我必须序列化/反序列化类“old fashion way”
如果您感兴趣,以下是解决方案:
我创建了一个“根”接口,在本例中是IModule。
此IModule仅包含一个名为Name的属性。
它是一个字符串,仅为方便起见:
示例中的IFormChecker将从此接口派生:
我的客户机知道这个Name属性的值,当然还有接口本身。
它现在将向服务器激发Name值,服务器将返回序列化的类
我所要做的就是:
var module = ModuleImplementations.FirstOrDefault(x => x.Name == name);
if(module == null) throw new SomeException();
return module.Serialize();
客户端方面,我可以反序列化它并将其转换到接口。就这样
这是我的模块化课程:
public static class ModuleSerialization
{
public static string Serialize(this IModule m)
{
using (var ms = new MemoryStream())
{
var bf = new BinaryFormatter();
bf.Serialize(ms, m);
return Convert.ToBase64String(ms.ToArray());
}
}
public static T Deserialize<T>(string serialized) where T : class, IModule
{
var ba = Convert.FromBase64String(serialized);
using (var s = new MemoryStream(ba))
{
var bf = new BinaryFormatter();
return bf.Deserialize(s) as T;
}
}
}
公共静态类模块序列化
{
公共静态字符串序列化(此IModule m)
{
使用(var ms=new MemoryStream())
{
var bf=新的二进制格式化程序();
bf.序列化(ms,m);
返回Convert.tobase64字符串(ms.ToArray());
}
}
公共静态T反序列化(字符串序列化),其中T:class,IModule
{
var ba=Convert.FromBase64String(序列化);
使用(var s=新内存流(ba))
{
var bf=新的二进制格式化程序();
返回bf。反序列化为T;
}
}
}
干杯 好像没有什么“魔术”之类的东西。
我必须序列化/反序列化类“old fashion way”
如果您感兴趣,以下是解决方案:
我创建了一个“根”接口,在本例中是IModule。
此IModule仅包含一个名为Name的属性。
它是一个字符串,仅为方便起见:
示例中的IFormChecker将从此接口派生:
我的客户机知道这个Name属性的值,当然还有接口本身。
它现在将向服务器激发Name值,服务器将返回序列化的类
我所要做的就是:
var module = ModuleImplementations.FirstOrDefault(x => x.Name == name);
if(module == null) throw new SomeException();
return module.Serialize();
客户端方面,我可以反序列化它并将其转换到接口。就这样
这是我的模块化课程:
public static class ModuleSerialization
{
public static string Serialize(this IModule m)
{
using (var ms = new MemoryStream())
{
var bf = new BinaryFormatter();
bf.Serialize(ms, m);
return Convert.ToBase64String(ms.ToArray());
}
}
public static T Deserialize<T>(string serialized) where T : class, IModule
{
var ba = Convert.FromBase64String(serialized);
using (var s = new MemoryStream(ba))
{
var bf = new BinaryFormatter();
return bf.Deserialize(s) as T;
}
}
}
公共静态类模块序列化
{
公共静态字符串序列化(此IModule m)
{
使用(var ms=new MemoryStream())
{
var bf=新的二进制格式化程序();
bf.序列化(ms,m);
返回Convert.tobase64字符串(ms.ToArray());
}
}
公共静态T反序列化(字符串序列化),其中T:class,IModule
{
var ba=Convert.FromBase64String(序列化);
使用(var s=新内存流(ba))
{
var bf=新的二进制格式化程序();
返回bf。反序列化为T;
}
}
}
干杯