2013-07-31 35 views
1

因为现在我实现服务尽可能与ServiceStack(或的WebAPI)一段时间。服务,而不是WCF提供接口impelementation以代替数据

我想现在做的是发送接口(-name)到服务器,并获得一个类实现了。也许这是令人困惑的,所以我给你举个例子:

我的服务客户端有多个操作 - 比如“check form”: 检查这个表单的逻辑没有实现。它有一个名为IFormChecker的接口,其方法如NameIsValid(string firstName, string middleName, string lastName)

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

我知道这是可能的WCF,但我不知道怎么做,与ServiceStack。 如果可能的话,还有什么方法可行?我查了文档,但我并不是很聪明。

回答

1

它接缝像有没有“魔术”或任何东西。 我必须序列化/反序列化类“老式的方式”。

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

我创建了一个“根” - 接口,在这个例子中是IModule的。 此IModule只包含1个名为Name的属性。 这是一个字符串,只有在那里为了方便:

该例的IFormChecker会从这个接口派生: 我的客户知道这个名称属性界面本身,当然还有价值。 它现在会将名称值激发到服务器,它将返回序列化的类。

所有我需要做的就是:

var module = ModuleImplementations.FirstOrDefault(x => x.Name == name); 
if(module == null) throw new SomeException(); 

return module.Serialize(); 

客户明智的,我可以反序列化,并将其转换为界面。而已。

这里是我的ModuleSerialization级:

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

干杯!