1

アプリケーションには、ビジネス ドメインやデータ アクセス レイヤーで現在ログインしているユーザー ID などにアクセスできるようにしたい多くのインスタンスがあります。ログでは、この情報をセッションにプッシュするため、もちろん、すべてのフロント エンド コードが非常に簡単にアクセスできます。ただし、アプリケーションの下位レイヤーのデータを取得する際に大きな問題が発生しています。ユーザー専用のグローバル スコープを持つビジネス ドメインに値を格納する方法を見つけることができないようです (もちろん、静的クラスとプロパティはアプリケーション ドメインによって共有されます。つまり、セッション内のすべてのユーザーが 1 つだけを共有します)。オブジェクトのコピー)。セッションをビジネス クラスに渡すことを検討しましたが、ドメインは Web アプリケーションに非常に緊密に結合されています。

私たちがこの種の問題を抱えた最初の人であるとは信じがたいです。アプリケーションでこの問題をどのように処理していますか?

4

3 に答える 3

3

ビジネスクラスをグローバルオブジェクトに依存させることは、それほど素晴らしいアイデアではなく、可能であれば避けたいと思います。それらに必要な情報を注入する必要があります-これにより、テストとスケーラビリティが大幅に向上します。

そのため、オブジェクトを直接渡すのではなく、Session必要な情報アクセス メソッドをリポジトリ クラスにまとめる必要があります。ビジネス レイヤーはリポジトリ クラスをデータ ソースとして使用でき (GetUser()たとえば、それを呼び出します)、Web アプリのリポジトリはセッションを使用して要求された情報を取得できます (return _session.User.Identity)。

それを winforms に移植するときは、新しい winform 中心のクラスを使用してリポジトリ インターフェイスを実装するだけです (つまりGetUser()、ユーザー プリンシパルの Windows バージョンを返します)。

于 2010-04-23T23:06:09.873 に答える
1

理論的には、人々はそれが悪いビジネス慣行だと言うでしょう。実際には、ビジネス層で常に利用可能なセッション レベルからのデータが必要でした。:-(

最終的に、小さなインターフェイスの下にさまざまなストレージ エンジンを統合することになりました。

public interface ISessionStorage 
{
   SomeSessionData Data {get;set;}
   ...
   .. and most of the data we need stored at "session" level
    }
 //and a singleton to access it
    public static ISessionStorage ISessionStorage;

このインターフェイスは、コードのほぼどこからでも利用できます。

次に、セッションおよび/またはシングルトン実装の両方があります

 public WebSessionStorage
{
   public SomeSessionData Data 
  {
       get { return HttpContext.Current.Session["somekey"] as SomeSessionData;}
      set { HttpContext.Current.Session["somekey"] = value;}
  }

public WebFormsSessionStorage
{
   private static SomeSessionData  _SomeSessionData; //this was before automatic get;set;
   public SomeSessionData 
   {
       get{ return _SomeSessionData;}
       set{ _SomeSessionData=value; }
}

}

アプリケーションを開始すると、ウェブサイトは

 Framework.Storage.SessionStorage = new WebSessionStorage(); 

Global.asax で、FormsApp が行います

 Framework.Storage.SessionStorage = new WebFormsSessionStorage(); 
于 2010-04-24T00:49:25.633 に答える
0

Womp に完全に同意します。データをフロントエンドから下位層に注入します。

中途半端なごまかしをしたい場合 (ただし、あまりごまかしたくない場合) にできることは、POCO クラスを 2 つだけ含む非常に小さなアセンブリを作成して、すべてのデバイス間で共有したいこのすべての情報を格納することです。層 (現在ログインしているユーザー名、ログイン時間など) を取得し、このオブジェクトをフロントエンドからビジネス/データ層に渡すだけです。これを行う場合、この POCO アセンブリを一般的なユーティリティ アセンブリに変換する誘惑を回避する必要があります。小さいままにしておく必要があります。そうしないと、将来問題が発生します (私を信頼するか、難しい方法を学ぶか、他の人にこれについて詳しく説明するよう依頼してください)。 1)。ただし、この POCO アセンブリがある場合、さまざまな層を介してこのデータを挿入することは非常に簡単になり、POCO であるため、非常に適切にシリアル化され、Web サービス、WCF などとうまく連携します。

于 2010-04-24T00:15:35.890 に答える