2011-06-19 33 views
0

我真的想讓我的頭繞過這個WCF技術,它似乎信息填充的最後幾個月有點扭曲了我應該如何建立我的客戶端/服務器應用程序的整體概念。WCF多接口

如果有人在開發我的應用程序並實現具有多個接口的Duplex WCF服務時可以瞭解一些最佳實踐。

一般提綱:我想開發一個應用程序,用戶連接到服務器,並可以說'..添加聯繫人到SQL數據庫。我發現了很多這樣做的方法,但最終還是希望知道即將開始進一步開發應用程序時,正在走向正確的道路。

我發現有一些機型...

客戶都有自己的LINQ to SQL類和所有的數據處理,並從數據.... BAD。真的很慢。 Linq Select命令執行不當的開銷與LINQ和SQL連接。

另一種模式是開發服務來實現用於CRUD操作的linq to sql命令,但是這仍然不會爲連接到該服務的其他客戶端提供實時數據更新。

所以我做了一個基本的應用程序,當一個客戶端登錄到服務那裏回調通道被添加到回調列表。當客戶端向服務提供新的聯繫人時,它會使用新聯繫人向所有渠道客戶端調用回叫,並且客戶端功能負責將聯繫人添加到正確的位置。

所以現在我想實現一個用戶對象,也許2個其他業務對象說,工程和項目,並讓說項目......我的想法是創建我的服務這樣的

[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和Entity Framework作爲解決方案,並通過WCF服務公開實體,但我缺乏理解實現客戶端之間的數據一致性。我設法開發了一個netDualTcp聊天應用程序,並使用客戶端回調上下文列表來發送加入/離開和聊天功能。我缺乏總體情況,但似乎如果我有我的sql數據庫中的所有表的內存(靜態)版本,並有客戶端直接綁定到這些列表,如果這是可能的或它似乎最適合我的自定義用戶控件來處理連接,以便服務器知道誰擁有該特定用戶控件,並且可以將這些更改指向那些註冊到回調協議的客戶端。這樣客戶就不必在每次打開應用程序時加載整個項目。我正在考慮一個多用途的應用程序,例如一個聯繫人/授權應用程序,用戶將使用應用程序的不同部分,並且並不總是需要一次訪問所有信息。當用戶第一次登錄時,我希望服務將爲客戶端附加一個回調協議,並將幾位信息加載回客戶端進行身份驗證,例如基本狀態,即如果他們是管理員,他們會收到通知等一次他們登錄後會顯示空白畫布,但隨後開始將自定義用戶控件加載到對接面板類型的界面中。我想這就是我對於如何最好地管理併發和一致性,同時最大限度地減少客戶端的負載/數據傳輸時間以及在兩個客戶端上釋放cpu進程時間的問題。我知道在編程中有多種方法可以做到這一點,但我想從這個論壇上的人們知道他們覺得這種靈感的最佳方法是什麼。我理解它是一個深刻的話題,但我覺得我已經走到了這麼遠,並且指導的手將不勝感激。再次感謝

回答

0

通常我發現服務的非抽象視圖讓我到正確的地方。我的服務消費者需要做什麼?

我顯然有我的業務層用來創建和操作數據的內部域對象。但是,業務層執行操作的方式不一定是爲我的服務劃分功能的最佳方式。

例如,如果任何項目至少有一個用戶在其中,那麼當您創建項目時,您應該至少同時發送一個用戶。服務操作需要封裝執行自包含業務事務所需的所有數據。

同樣,許多分佈式系統的死亡跪伏是等待時間 - 他們需要大量往返才能完成某些事情。因此,例如,您希望能夠將用戶添加到項目;實際上你可能想要添加一些用戶作爲項目。因此,您應該對操作進行建模以接受非多次調用的用戶列表

因此,項目服務應該允許您通過服務執行與項目或項目相關的所有事情合同。如果用戶可以獨立於項目生活,那麼也有用戶服務。如果他們不能那麼沒有用戶服務,因爲一切都需要專注於項目。

商業交易往往比簡單的CRUD操作更加域實體和服務應而他們的模型不是反映了數據模型

+0

感謝您的迴應理查德。由於我是新手,並且被限制爲幾個字作爲回覆主題,所以我在原帖中留下了一條筆記作爲編輯。再次感謝您的回覆。克里斯 –