As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened,
visit the help center作为指导。
6年前关闭。
我正在使用基于CS的自定义设计开发与CSLA.NET类似的客户端/服务器业务软件系统。我将要做的是创建客户端和服务器对象,其中客户端方法调用被序列化为json(使用json.net)或其他格式,然后在服务器上反序列化为镜像服务器版本。我正在使用自定义属性来标记可以远程调用的函数和类。如果它是一个实例方法,它也会对调用对象进行序列化,而静态调用显然只是对方法参数进行序列化。服务器调用完成后,它将在实例调用的情况下以方法结果,错误状态和对象的新副本进行响应。
我已经有此运行的测试版本。我现在想做的是找出用于这些客户端和服务器对象的最佳模式。我的测试版本在客户端和服务器上使用完全独立的类。虽然可以,但是我希望它们能够更紧密地结合在一起,以确保所有属性都相同等。
我是C#的新手,对它们没有太多的经验,但是我认为也许使用接口是最好的方法。我并不是选择接口与普通类继承的100%原因,但是我无法想到在任何情况下我都会使用基类实现,因此这似乎是一个合理的选择。我遇到的问题是当我尝试执行类似的操作时,该方法具有返回
LoadCustomers
的
List<IMyObject>
方法。客户端版本需要将
List<IMyObject>
强制转换为
List<MyObject_Client>
。但这会出错。看起来,虽然它可以自己转换类,但使用此类泛型时却无法工作。我认为每次使用
List
中的项目与强制转换
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#新手。我猜它可能会提高可读性?
从所有位置都集中在一起的角度来看,拥有一个类将是一件好事,因为您要在服务器上使用的确切对象名称与在客户端上使用的对象名称完全相同,因此使客户端到服务器的调用更加容易。问题在于,将客户端对象与服务器对象隔离也是有好处的。
所以我的问题是这些客户端服务器对象应使用哪种模式?
我担心的是:
稳健性/可靠性/速度-它将取代实际的现有产品
产品,这样我就不需要慢代码或“ hacky”代码)
可维护性-我希望能够轻松进行更新并保持
客户端和服务器对象都同步。编译器提供的帮助越多,可以确保我不会错过任何一个对象,那就更好了
可读性-这是可维护性的一部分,但它非常
对我来说很重要的是,简单易懂的代码
将由多个开发人员使用。简单来说,对于理解我们正在使用的模式的程序员来说,这意味着容易。
实施的时间-我来自一个可怕的胖客户世界,但是
它唯一的好处之一就是我只需实施一个
每个方法的版本。现在我有两个。更容易,更快捷
更好地实现每种方法。
静态-我希望可以同时使用静态和非静态
静态方法。我想要一些类似LoadCustomers的方法
成为静态电话。我尝试了我认为的抽象类并遇到了
方法静态时出现问题。
平台-我必须支持在每个平台上运行客户端和服务器
Windows版本从Windows XP开始。我也必须能够
在任何平台(网络或互联网)上支持第三方客户实施
桌面或移动)。我们提供主要的桌面应用程序来使用
软件,但我们希望能够开始与
使用基于html的客户端的手持设备(带有条形码扫描仪)
写。另外,今天第3方将直接写入我们的数据库,因此
未来,我希望能够为他们提供安全的API以便使用
阻止他们破坏我们客户的数据,因为他们没有
知道他们在做什么:D