我正在使用基于HTTP的自定义设计开发客户端/服务器业务软件系统,该设计与CSLA.NET类似。我将要做的是创建客户端和服务器对象,其中客户端方法调用被序列化为json(使用json.net)或其他格式,然后在服务器上反序列化为镜像服务器版本。我使用自定义属性来标记可以远程调用的函数和类。如果它是一个实例方法,它也将序列化调用对象,而静态调用显然只是序列化方法参数。当服务器调用完成时,它将在实例调用的情况下响应方法结果,错误状态和对象的新副本。
我已经有了这个运行的测试版本。我现在要做的是找出用于这些客户端和服务器对象的最佳模式。我的测试版在客户端和服务器上使用完全独立的类。虽然有效,但我希望它们能够更加紧密地结合在一起,以确保所有属性都相同等。
我对C#比较新,并且没有很多经验,但我认为使用接口可能是最好的方法。我不是100%选择接口与普通类继承的原因,但我现在无法想到我将使用基类实现的任何情况,所以它似乎是一个合理的选择。我遇到的问题是当我尝试使用LoadCustomers
方法返回List<IMyObject>
时。客户端版本需要将List<IMyObject>
投射到List<MyObject_Client>
。但它会出错。似乎虽然它适用于自己编写类,但是当你使用这样的泛型来做它时它不起作用。我想每次我使用List
vs中投射List
本身的项目时,我都可以通过投射获得,但这对我来说似乎更加混乱。我还担心在界面中定义属性,如List<IMyObject>
,从技术上讲,他们会接受IMyObject
的任何类型的实现,但实际上当我在客户端时,我只想要MyObject_Client
个对象在那个清单中。如果我使用简单的类继承而不是接口,这两个问题似乎也会存在。
所以在这一点上我认为最好的选择是让它成为客户端和服务器的一个对象。这意味着我会有一些静态上下文类来维护程序是使用客户端还是服务器对象。然后在每个方法中看起来像这样:
if (MyContextObject.ObjectContext == ocClient)
{
//Code to serialize and make call to server and return result
} else {
//Actual business logic
}
或
if (MyContextObject.ObjectContext == ocClient)
{
//Call to private client version of the function
} else {
//Call to private server version of the function
}
我还考虑过使用在构造函数中设置的委托,具体取决于上下文。我不确定这是否值得,因为我是一个C#新手。它可能会提高可读性吗?
从一个地方开始,有一个类是很好的,它可以更容易地促进客户端到服务器的调用,因为要在服务器上使用的确切对象名称与在客户端上。问题是将客户端对象与服务器对象隔离也有其好处。
所以我的问题是我应该为这些客户端服务器对象使用什么模式?
我担心的是:
答案 0 :(得分:1)
您的问题非常广泛,但根据我们交换的意见,并试图远离表达意见,我将列出两条可能的路线 - 两种提供面向服务的客户端 - 服务器解决方案的工具:
我应该补充一点,在我看来,如果您需要对应用程序的服务器端进行分层,那么您提到的CSLA和OOP设计的价值会变得更有价值。该框架可以开箱即用,或作为各种问题/解决方案对的案例研究学习工具:业务规则定义/执行,跨境方法调用,数据层设计等。我会发现它非常严格,如果CSLA或类似的风格实施强加给客户 - 特别是如果您的目标是本机移动平台,或者如您的问题所示。第三方客户端实施。