2

winforms を使用してアプリケーションを実装しようとしています。3 層アーキテクチャ (GUI、ビジネス ロジック、データ アクセス層) が必要です。

顧客ごとに 1 つのデータベースがあるため、アプリケーションを使用してさまざまなデータベース (さまざまなサーバー上でも可能) にアクセスできる必要があります。たとえば、顧客 A はサーバー A にあり、顧客 B はサーバー B にいます。

編集: 展開シナリオ: このアプリケーションは ServerA にインストールされている可能性がありますが、データベースは ServerA、ServerB、ServerC、ServerX にインストールされている可能性があります (画像が得られると思います)。

ユーザーが接続したいデータベースがわからないため、データベースからデータベース接続を読み取るのはやや複雑です。さらに、ユーザーIDは同じデータベース内でのみ一意であるため、「admin」などのユーザー名を持つユーザーは複数のデータベースに存在できます:)

ユーザー名、パスワード、および接続文字列情報を提供するアプリケーションにログオンできるようにしたいと考えています。では、接続文字列情報を DAL に送信して、GUI もビジネス レイヤーもデータベース接続文字列を認識しなくても済むようにするにはどうすればよいでしょうか。接続文字列を GUI プロジェクトに保存し、それをパラメーターとしてビジネス層に渡し、データベースにデータが必要になるたびに接続文字列を DAL に渡したくありません。

編集: 接続文字列情報は、ユーザーがログインしている間のみ利用可能である必要があります。ユーザーがログアウトするとすぐに、この情報は削除する必要があります)

ApplicationSettingsBase から継承する新しいプロジェクトにクラスを実装しました (UI プロジェクトと DAL プロジェクトの両方が新しいプロジェクトへの参照を持っています)。これで、接続情報を (デフォルトで user.config ファイルに) 永続化できるようになりました。そのため、ユーザー インターフェイスからそのクラスをインスタンス化し、クラスで base.Save を呼び出して接続情報を保存し、DAL で同じクラスをインスタンス化し、そこで接続情報を読み取ることができます。user.configファイルがWindowsユーザーに関連付けられているため(ファイルを C:\Users...\AppData\ 階層に保存することにより、そのソリューションが好きかどうかわかりません。これを行うことによるパフォーマンスについてはわかりませんやり過ぎかな?

編集:私はまだ満足のいく解決策を見つけることができなかったので、コミュニティからのより多くの回答に感謝します:)

編集:

これを解決する方法を見つけました。私は小さなテスト プロジェクトでソリューションをテストしただけですが、次のようになります。

ユーザーがログインすると、ログイン情報の取得を担当する UI メソッドが次のメソッドを実行します。

public void SetTempSetting()
{
       // Get the configuration file.
       Configuration config  = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);           

       // Add the connection string.
       ConnectionStringsSection csSection = config.ConnectionStrings;
                csSection.ConnectionStrings.Add(new ConnectionStringSettings("ConnectionStringName", GetConnectionString()));

      // Save the configuration file.
      config.Save(ConfigurationSaveMode.Modified);

}

SetTempingSetting() メソッドは、接続文字列を ProjectName.dll.config に書き込みます。

DAL プロジェクトでは、次のように ConfiguraionManager から接続文字列を取得できます。

var connectionstring = ConfigurationManager.ConnectionStrings["ConnectionStringName"].ConnectionString;

また、ユーザーがアプリケーションからログアウトすると、logout メソッドはこのメソッドを実行して Project.dll.config から接続文字列を削除できます。

public void RemoveTempSetting()
        {
            // Get the configuration file.
            Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);            
            // Add the connection string.
            ConnectionStringsSection csSection = config.ConnectionStrings;
            csSection.ConnectionStrings.Remove("ConnectionStringName");
            // Save the configuration file.
            config.Save(ConfigurationSaveMode.Modified);            
        }

この解決策について何か考えはありますか?長所?短所?オーバーエンジニアリング?設計が悪い?

4

4 に答える 4

2

DAL には、ある種の構成データベースが必要です。構成データベースに接続し、特定の顧客の接続情報を要求し、それを使用してクエリを解決する方法を知る必要があります。おそらく、顧客 ID を DAL に渡しています。

接続情報は、その性質上実装固有であるため、ビジネス オブジェクトやプレゼンテーション層ではなく、DAL に適切に属していると私は主張します。

その「構成データベース」が構成ファイルであるか、他の何かであるかは、設計/実装の選択です。たとえば、接続文字列をユーザー属性として LDAP (顧客ごとに 1 人の LDAP ユーザー) に保存することを妨げるものは何もありません。

于 2011-05-10T16:57:21.847 に答える
1

複数の顧客をサポートすることは常に課題です。この問題に対する私の解決策は、データベースの種類ごとに DAL を作成することでした。これらはすべて同じ定義済みインターフェイスを使用していました。プログラムの起動時に、顧客の構成に基づいて適切な DAL のインスタンスをインスタンス化しました。DAL の構成ファイル内の適切な接続文字列への参照であるトークンを DAL に渡しました (DAL は Web サービスの中間層の一部でした)。ここではメモリから行っているので、すべての詳細を正しく理解していることを願っていますが、主な概念は、依存性注入を使用して適切な DAL をインスタンス化し、インスタンス化された DAL のプロパティを設定して、適切な接続文字列を取得できるようにすることです。これにより、接続文字列をクライアントに保存する必要がなくなります。そのため、ログオン時に、

于 2011-08-31T18:34:28.767 に答える
0

私の意見では、接続文字列はデータ アクセス レイヤーに格納する必要があります。

于 2011-05-10T16:56:11.387 に答える