1

しばらくの間、WCF の代わりに ServiceStack (または WebAPI) を使用して、可能な限りサービスを実装しています。

私が今やりたいことは、インターフェイス (-name) をサーバーに送信し、クラスの実装を取得することです。ややこしいかもしれないので、以下に例を示します。

私のサービス クライアントには、「フォームのチェック」などの複数の操作があります。このフォームをチェックするロジックが実装されていません。それが持っているのは、のIFormCheckerようなメソッドで呼び出されるインターフェースNameIsValid(string firstName, string middleName, string lastName)です。

検証のためにフォームデータ全体をサーバーに送信する代わりに、クライアントはIFormCheckerサーバーからの実装を要求します。

WCF でそれが可能であることはわかっていますが、ServiceStack でそれを行う方法がわかりません。それが可能なら、どのような方法がありますか?ドキュメントを確認しましたが、あまり賢くありません。

4

1 に答える 1

1

「手品」などはないようです。クラスを「昔ながらの方法」でシリアライズ/デシリアライズする必要があります。

興味がある場合は、次の解決策があります。

「ルート」インターフェイスを作成しました。この例では IModule です。この IModule には、Name というプロパティが 1 つだけ含まれています。これは文字列であり、便宜上のみ存在します。

この例の IFormChecker は、このインターフェイスから派生します。私のクライアントは、この Name プロパティの値と、もちろんインターフェイス自体を知っています。これで Name-value がサーバーに送信され、シリアル化されたクラスが返されます。

私がしなければならないことは次のとおりです。

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

return module.Serialize();

クライアントごとに、デシリアライズしてインターフェイスにキャストできます。それでおしまい。

ここに私の ModuleSerialization-Class があります:

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 に答える