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);
}
この解決策について何か考えはありますか?長所?短所?オーバーエンジニアリング?設計が悪い?