【问题标题】:Ideas to implement generic web service实现通用 Web 服务的想法
【发布时间】:2012-12-29 12:20:33
【问题描述】:

我正在考虑一个中/大型项目,它需要存储不同的数据类型并将它们呈现给不同的客户。

我现在苦苦挣扎的是,如何构建一个能够存储不同类型对象并在需要时查询它们的数据和服务层。

例如,考虑一个客户端 - 服务器应用程序,其中客户端只能读取每个单独的服务器的广播,现在考虑一个场景,花店和餐馆将他们的数据广播给街上的一个人电话。

class SoCalledServer
{
    public AccessibleClientData Broadcast(ClientData broadcastMessage)
    {
        Broadcast(broadcastMessage)
    }
}

class RestaurantClient : AbstractClient
{
    public SomeGenericDataType menu;
    public RestaurantClient()
    {
        menu = new SomeGenericDataType<List>();
        menu.Add("Sushi");
        menu.Add("Fried potatoes");
    }

    public override void BeginBroadcast()
    {
        server.Broadcast(menu);
    }
}

class FlowerShopClient : AbstractClient
{
    public SomeGenericDataType flowersOnSale;
    public FlowerShopClient()
    {
        flowersOnSale = new SomeGenericDataType<List>();
        flowersOnSale.Add("Daisy");
        flowersOnSale.Add("Rose");
    }

    public void BeginBroadcast()
    {
        server.Broadcast(flowersOnSale);
    }
}

在这个例子中,我有两种不同类型的数据(一种是餐厅的菜单,另一种是花店的鲜花),它们可以有不同的成员(例如,菜单有价格和成分,花店的数据有花名和描述、数量和/或价格等...),这个“客户”样本可以扩展。

我应该如何为这种类型的应用程序建模?我应该使用什么样的数据库模式来存储身份不明的和各种类型的数据?我的服务器和客户端应用程序应该如何相互通信?而最重要的客户端应该如何获取广播的数据类型(从泛型类型)?

【问题讨论】:

    标签: c# generic-programming


    【解决方案1】:

    该服务将如何处理这些数据?它只会保存它吗?它会用这些数据做一些计算吗?你的描述太笼统了。

    假设您只想写入/保存/读取数据,您可以简单地保存字符串并让客户端自己进行解析。可以根据id查询。键/值和文档数据库就是这样工作的。

    除此之外,你应该考虑一下服务的职责应该是什么,并相应地设计内部结构。

    【讨论】:

    • 服务负责读取/写入数据,服务器角色应用程序应该能够查询该服务以访问其存储的对象。服务可能需要也可能不需要计算,但服务器应用程序可以修改自己的数据。我不喜欢存储纯字符串的想法,希望通过将这些数据绑定到通用对象/类或类型来实现它。
    • @Alaminut 泛型类型仅适用于编译时检查。您要在编译时定义所有数据类型吗?你会通过简单地添加 dll 来扩展服务吗?不?然后我发现字符串没有问题。或者可能是 Json 文档。
    • 那么客户端如何知道它从服务器获取什么类型的数据呢?假设我已经为餐厅推出了这个应用程序来向客户广播他们的菜单和促销活动,我以后如何添加对药店的支持?比如,他们可以宣布他们的签约医院等等......?
    • @Alaminut 客户端必须告诉您它打算读取/写入/修改什么样的数据。您绝对应该查看 RavenDB 等文档数据库。
    • 如果是这样就好了。但是你的回复给了我这个想法。与您所说的相反,我的服务器应该告诉它正在发送什么样的数据,以便客户端知道会发生什么。我会检查 RavenDB 谢谢。
    【解决方案2】:

    另一个想法是将它们反序列化为 XML 或 Json。一些提示:

            // get stuff here
            String json = GetJsonString(expression));
    
            List<T> result;
            using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
            {
                var serializer = new DataContractJsonSerializer(typeof(List<T>));
                result = (List<T>)serializer.ReadObject(ms);
            }   
    

    或 XML: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx

    您可以将对象转换为 XML/Json 进行传输。然后,为了存储,在类未知的一侧将它们反序列化为匿名对象(没有指定类)。

    有了这个,即使类别未知,您也始终可以存储所有数据。随时随地。

    【讨论】:

    • 嗯,不错的主意。为了扩展安全性,我可以加密存储的字符串等...感谢您的建议。
    猜你喜欢
    • 2016-11-09
    • 1970-01-01
    • 2016-02-13
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多