2011-06-19 12 views
0

私はこのWCFテクノロジの周りに頭を浮かべたいと思っています。情報詰め込みの最後の月は、クライアント/サーバーアプリケーションをどのように構築すべきかという私の全体的な考え方を多少歪めてしまったようです。WCF Multiple Interface

私のアプリを開発し、複数のインターフェースを備えたDuplex WCFサービスを実装する際に、ベストプラクティスを紹介する人がいるかもしれません。

概要:私はユーザーがサーバーに接続し、「.. SQLデータベースに連絡先を追加する」というアプリケーションを開発したいと考えています。私はこれを行うための多くの方法を発見しましたが、最終的には、アプリをさらに開発する時間が来たときに、正しい方向に向かっていることを知りたいと思っています。私が発見した

一部のモデルでは、ある...

クライアントはSQLクラスに独自のLINQを持っており、BAD ....データにしてから、すべてのデータを処理します。本当に遅い。 Linq Selectコマンドの実装が悪い間に、LINQとSQL接続のオーバーヘッド。

もう1つのモデルは、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 

    } 
    } 

のようにそれを行うが、私はいくつかの「ベストプラクティス」を必要とすることを感じるだろう援助。

事前に多くのおかげで,,

クリスリーチ

こんにちはリチャード、 私はあなたの応答を感謝しています。ご覧のとおり、これはプログラミングに関するすべてのフォーラムで初めての投稿と3度目です。私は自分のプログラミングの人生をGoogleのオートフィルの歴史に示すようにGoogleに非常に近いところに住んでいたが、自分自身の質問をする時間があったので、これまでのご支援に感謝します。私は、分散クライアント/サービスアプリケーション間でデータの一貫性を最良に管理するための全体的なアプローチを理解したいと思っています。私はTelerik ORMとEntity Frameworkをソリューションとして探し、エンティティをWCFサービスを通じて公開していますが、クライアント間でデータの整合性を実装するための理解が不足しています。私はnetDualTcpチャットアプリケーションを開発し、クライアントコールバックコンテキストのリストを使用してjoin/leaveとchat機能を送信しました。私は全体的な画像が不足しているが、私はSQLデータベース内のすべてのテーブルのメモリ(静的)バージョンを持っているかのいずれかがクライアントが直接これらのリストにバインドする可能性がある場合、またはそれは私のカスタムユーザーサーバーは特定のユーザーコントロールを開いているユーザーを認識し、コールバック契約に登録されているクライアントに変更を指示できるように、接続を処理するコントロールを提供します。そうすれば、クライアントはアプリケーションを開くたびにプロジェクト全体をロードする必要はありません。私は、ユーザーがアプリケーションのさまざまな部分を使用し、一度にすべての情報にアクセスする必要はない連絡先/許可アプリケーションプログラムなどの多目的アプリケーションについて考えています。ユーザーが最初にログインすると、サービスがクライアント用のコールバック契約を結ぶことが期待され、基本状態などの認証時にいくつかの情報がクライアントに戻されます。つまり、管理者の場合は、彼らはログインしてブランクキャンバスで表示されますが、カスタムユーザーコントロールをドッキングパネルタイプのインターフェイスにロードし始めます。私はこれが、クライアントへの負荷/データ転送時間を最小限に抑えながら、両方のクライアントでCPUの処理時間を解放しながら、並行性と一貫性を最善に管理する方法についてちょっと固執していると思います。私はプログラミングでこれを行う方法が複数あることを知っていますが、私はこのフォーラムの人々から、このタイプのソウルティションに対する最良のアプローチが何であるかを知りたいと思います。私はその深い話題を理解していますが、私はこれまでに来ていると感じており、指導的な手が認められるでしょう。ありがとうございました

答えて

0

一般的に私は、サービスの非抽象的な見方を取ることは、私を正しい場所に連れて行くことがわかります。私のサービスの消費者は何をする必要があるのでしょうか?

明らかに、私のビジネスレイヤーがデータを作成し操作するために使用する内部ドメインオブジェクトを持っています。しかし、ビジネス層がどのように機能するかは、必ずしも私のサービスのための機能を分割する最良の方法ではありません。

たとえば、プロジェクトに少なくとも1人のユーザーが存在する場合は、プロジェクトを作成するときに同時に少なくとも1人のユーザーを送信する必要があります。サービス操作では、自己完結型ビジネストランザクションを実行するために必要なすべてのデータをカプセル化する必要があります。

同様に、多くの分散システムの死は、レイテンシです。何かを完成させるには多くの往復が必要です。したがって、たとえば、プロジェクトにユーザーを追加できるようにしたいとします。実際には、プロジェクトとして複数のユーザーを追加することをお勧めします。したがって、複数の呼び出しが必要な単一のものではなく、ユーザーのリストを受け入れるように操作をモデル化する必要があります。

プロジェクトサービスは、プロジェクトやサービスに関連するすべてのことをサービス契約する。ユーザーがプロジェクトから独立して生活できる場合は、ユーザーサービスもあります。ユーザーがプロジェクトに焦点を当てる必要があるため、ユーザーサービスを提供できない場合

ビジネストランザクションは、ドメインエンティティにまっすぐCRUD操作よりも多くの場合で、サービスはあなたの応答リチャードため

+0

おかげでデータモデルを反映するのではなく、それらをモデル化する必要があります。私はstackoverflowに新しいので、返信のトピックとしていくつかの単語に限られていたので、私のorignal投稿の編集としてメモを残しました。お返事ありがとうございました。クリス –