0

我真的很想了解这种 WCF 技术,而且过去几个月的信息填塞似乎有点扭曲了我应该如何构建我的客户端/服务器应用程序的整体概念。

如果有人可以在开发我的应用程序和实现具有多个接口的双工 WCF 服务时对最佳实践有所了解。

一般大纲:我想开发一个应用程序,用户连接到服务器并让我们说'..将联系人添加到 sql 数据库。我已经发现了很多方法来做到这一点,但最终想知道我在进一步开发应用程序时走的是正确的道路。

我发现的一些模型是...

客户端有自己的 LINQ to SQL 类,并处理与数据之间的所有数据......糟糕。真的很慢。LINQ 和 SQL 连接的开销在 Linq Select 命令的不良实施中。

另一个模型是开发服务来实现用于 CRUD 操作的 linq to sql 命令,但是这仍然不向连接到该服务的其他客户端提供实时数据更新。

所以我做了一个基本的应用程序,当客户端登录到服务时,回调通道被添加到回调列表中。当客户端向服务提供新联系人时,它会使用新联系人调用所有通道客户端的回调,并且客户端函数负责将联系人添加到正确的位置。

所以现在我想实现一个用户对象,也许还有两个其他业务对象说项目和项目,让我们说项目......我的想法是像这样创建我的服务

[Serializable]
[DataContract]
[ServiceBehavior(
   ConcurrencyMode = ConcurrencyMode.Single,
   InstanceContextMode = InstanceContextMode.PerCall)]
public class Project: IProject
       {
    [DataMember()]
    public int projectID;
          public int Insert(objSubItem _objSubItem)
    {
        // code here
               }

等和

 [ServiceContract(
    Name = "Project",
    Namespace = "",
    SessionMode = SessionMode.Required,
    CallbackContract = typeof(IProjectCallback))]
public interface IProject
{
    /// <summary>
    /// Inserting a Project record to the database
    /// </summary>
    /// <param name="_project">Project from Client</param>
    /// <return>ProjectID back to the client if -1 then fail</return>
     [OperationContract()]
     int Insert(Project _project);

    public interface IProjectCallback
{
     /// <summary>
    /// Notifies the clients that a Project has been added
    /// </summary>
    /// <param name="_project">Inserted Project</param>
    [OperationContract(IsOneWay = true)]
    void NotifyProjectInserted(Project _project);
}

显然,我还有其他 crud 函数和函数来确保客户端和服务器数据记录在编辑时都是只读的。

现在,如果我有多个对象,最好的布置方式是什么。

我正在考虑创建一个 servce.cs 和一个 Iservice.cs 和一个 IserviceCallback 来协商客户端通道人口。我还使用服务的部分类来实现 Iproject 和 IUser 以正确调用服务回调以及调用对象插入。

我会这样做吗

 [ServiceContract(Name = "Service",
 Namespace = "", 
 SessionMode = SessionMode.Required, 
 CallbackContract = typeof(IServiceCallBack))]
 [ServiceKnownType(typeof(Project))]
 [ServiceKnownType(typeof(User))]
 public interface IService
 {

     // code here
 }

并且

    [ServiceBehavior(
    ConcurrencyMode = ConcurrencyMode.Single, 
    InstanceContextMode = InstanceContextMode.PerCall)]
    public partial class Service :  IUser
    {

    public int Insert(User _User)
    {
       //       
    }
    }
    public partial class Service : IProject
    {

    public int Insert(Project _project)
    {
       // code here
    }
    }
    public partial class Service : IService
   {

    //   functions here 

    }
    }

如果感觉好像该方法适用于一个界面,但感觉我需要一些“最佳实践”帮助。

提前谢谢了,,

克里斯·利奇

嗨,理查德,感谢您的回复。如您所见,这是我在任何与编程相关的论坛上的第一篇文章,也是第三篇文章。正如我的谷歌自动填充历史所示,我的编程生活与谷歌非常接近,但现在是时候开始提出我自己的问题了,所以我感谢你迄今为止的帮助。我真的很想了解如何最好地管理分布式客户端/服务应用程序之间的数据一致性的整体方法。我正在研究 Telerik ORM 和实体框架作为解决方案,并通过 WCF 服务公开实体,但我缺乏在客户端之间实现数据一致性的理解。我设法开发了一个 netDualTcp 聊天应用程序,并使用了一个客户端回调上下文列表来发送加入/离开和聊天功能。我缺乏整体情况,但似乎如果我的 sql 数据库中的所有表都有一个内存(静态)版本,并且如果可能的话,或者让客户端直接绑定到这些列表,或者这对我的自定义用户来说似乎是最好的控件来处理连接,以便服务器知道谁打开了该特定用户控件,并可以将更改定向到注册到回调合同的那些客户端。这样客户就不必在每次希望打开应用程序时加载整个项目。我正在考虑一个多用途应用程序,例如联系人/授权应用程序,其中用户将使用应用程序的不同部分,并且并不总是需要一次访问所有信息。当用户第一次登录时,我希望该服务将为客户端附加一个回调合同,并且在身份验证操作(例如基本状态)时将几位信息加载回客户端,即如果他们是管理员,他们会收到通知等一次他们已登录,他们会看到一个空白画布,但随后开始将自定义用户控件加载到停靠面板类型的界面中。我想这就是我对如何最好地管理并发性和一致性同时最小化到客户端的加载/数据传输时间并释放两个客户端上的 cpu 处理时间的问题感到有点困惑的地方。我知道在编程中有多种方法可以做到这一点,但我想从这个论坛上的人们那里知道他们认为这种类型的灵魂的最佳方法是什么。我理解这是一个很深的话题,但我觉得我已经走到了这一步,我将不胜感激。再次感谢

4

1 回答 1

0

一般来说,我发现对服务采取非抽象的观点会让我找到正确的地方。我的服务的消费者需要做什么?

显然,我的业务层使用内部域对象来创建和操作数据。但是,业务层执行的方式不一定是为我的服务划分功能的最佳方式。

因此,例如,如果任何项目应该至少有一个用户,那么当您创建项目时,您应该同时发送至少一个用户。服务操作需要封装执行自包含业务事务所需的所有数据。

同样,许多分布式系统的丧钟是延迟——它们需要大量往返才能完成某些事情。因此,例如,您希望能够将用户添加到项目中;实际上,您可能希望将一些用户添加到项目中。因此,您应该对操作进行建模以接受用户列表,而不是必须多次调用的单个用户列表

因此,项目服务应该允许您通过服务合同完成与一个或多个项目相关的所有事情。如果用户可以独立于项目生活,那么也有用户服务。如果他们不能,那么就没有用户服务,因为一切都需要以项目为中心。

业务事务通常不仅仅是对域实体的直接 CRUD 操作,服务应该对它们进行建模而不是反映数据模型

于 2011-06-19T10:32:22.177 回答