servicestack,Web Services,Interface,servicestack" /> servicestack,Web Services,Interface,servicestack" />

Web services 提供接口实现而不是数据的服务

Web services 提供接口实现而不是数据的服务,web-services,interface,servicestack,Web Services,Interface,servicestack,从一段时间以来,只要有可能,我就用ServiceStack(或WebAPI)而不是WCF实现服务 我现在要做的是向服务器发送一个接口(-name),并返回一个类实现。也许这让人困惑,所以我给你举个例子: 我的服务客户端有多个操作,如“检查表单”: 未实现检查此表单的逻辑。它有一个名为ifformchecker的接口,使用NameIsValid(stringfirstname、stringmiddlename、stringlastname)等方法 客户端将从服务器请求实现IFormChecker,

从一段时间以来,只要有可能,我就用ServiceStack(或WebAPI)而不是WCF实现服务

我现在要做的是向服务器发送一个接口(-name),并返回一个类实现。也许这让人困惑,所以我给你举个例子:

我的服务客户端有多个操作,如“检查表单”: 未实现检查此表单的逻辑。它有一个名为
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;
}
}
}
干杯