1

一段时间以来,我尽可能使用 ServiceStack(或 WebAPI)而不是 WCF 来实现服务。

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

我的服务客户端有多个操作——比如“检查表单”:检查这个表单的逻辑没有实现。它有一个接口IFormChecker,用类似的方法调用NameIsValid(string firstName, string middleName, string lastName)

客户端不会将整个表单数据发送到服务器进行验证,而是IFormChecker从服务器请求实现。

我知道 WCF 可以做到这一点,但我不知道如何使用 ServiceStack 来做到这一点。如果有可能,那该怎么走?我检查了文档,但我并不是很聪明。

4

1 回答 1

1

看起来好像没有“魔术”或任何东西。我必须对“老式方式”类进行序列化/反序列化。

如果你有兴趣,这里是解决方案:

我创建了一个“根”接口,在这个例子中它是 IModule。此 IModule 仅包含 1 个属性,称为 Name。它是一个字符串,只是为了方便起见:

示例中的 IFormChecker 将派生自此接口:我的客户知道此 Name 属性的值,当然还有接口本身。它现在将 Name-value 触发到服务器,服务器将返回序列化的类。

我所要做的就是:

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;
        }
    }
}

干杯!

于 2013-07-31T19:32:50.927 回答