- - PR -
WebアプリのDLLとWindowsアプリのDLL
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-11-04 09:36
お世話になってます。
データーベースに接続するオブジェクトを集めたクラス・ライブラリを作っているのですが、それをWebアプリからでもWindowsアプリからでも使えるようにしたいと思っています。(1つのDLLをWebとWindowsから参照するわけではありません。Webで使ったものをそのままコピーすればWindowsにも使える、というようにしたいのです。) それで、Connection StringだけはDLLの外から可変にしたいのですが、とはいってもそのライブラリの中のクラスオブジェクトを生成するたび、もしくはクラスのstaticなメソッドを呼び出すたびにConnection Stringの値を渡すのもどうかと思ったので、Connection Stringを含んだXMLファイルをそのDLLとセットで使うようにして、DLLからそのXMLを読んだらどうかと思いました。 たとえばこんな感じです。 class DataBaseConnection { static readonly string CNN_STRING; static DataBaseConnection() { XmlDocument xml = new XmlDocument(); string path = Path.GetDirectoryName( (typeof(GCDB)).Module.FullyQualifiedName ) + "\\DbInfo.xml"; xml.Load( path ); XmlNode root = xml.DocumentElement; string xpath = "ConnectionString"; XmlNode node = root.SelectSingleNode(xpath); CNN_STRING = node.Attributes["Value"].Value.ToString(); } public static DbConnection CreateDbConnection() { DbConnection cnn = new SqlConnection( CNN_STRING ); return cnn; } } しかし、Windowsアプリではちゃんと読み込むのですが、ASP.NETで呼び出すと、DLLをテンポラリーな場所にコピーしてロードするらしく、もちろんbinフォルダにそのXMLファイルをDLLと一緒に置いても、ファイルが見つからない、とエラーになります。 何か良い方法がありましたらお知恵をいただけないでしょうか。もしくは何か、そもそも根本から発想が間違っている、ということなどありますでしょうか? | ||||||||||||
|
投稿日時: 2006-11-04 11:42
「CodeBase プロパティ」 で、こちらの会議室を検索してください。 と言いたいところなのですが、*.config を使った方が、まだ良いのではないかと思います。 汎用性を重視するのであれば、引数でしょう。 なぜ、"Connection String の値を渡すのもどうかと思った" のかが、いまいちわかりません。 指定するのが面倒であれば、接続用の中間メソッドを各案件ごとに書くだけで済むと思います。 その中間メソッドを呼び出すのに引数は不要です。 何でもかんでもライブラリで解決しようとすると、汎用性が薄くなります。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2006-11-04 13:57
どうもありがとうございます。頂いたアドバイスに従ってもう一度調べてみることにします。
そのライブラリに、例にあげたようなDB接続用のクラスと、その接続用のクラスを使ったすべてのクラス(多分20個くらい、こちらが直接アプリケーションから使われる)が入るのですが、すべてのクラスのコンストラクタとすべてのスタティック・メソッドにConnectionStringを引数で指定するほうがいいのでしょうか?中間メソッドというのに今一ピンときてなくて申し訳ないのですが、とすると、中間メソッドは、クラス20個分作る、という感じになるのでしょうか? 変な質問をしていたら大変もうしわけありません。 | ||||||||||||
|
投稿日時: 2006-11-04 14:07
個人的には、そう思っています。 クラスが 20 あろうと 200 あろうと中間メソッドは 1 つなので、何ら問題ないと思います。
いわゆる 「共通で使うモジュール」 に当たる部分に書いておけば良いと思います。 それとも、クラスによって接続文字列が変わって、それが 20 通りあるということなのでしょうか? また、中間メソッドで外部ファイルから動的に ConnectionString を取得するというのもアリでしょう。 私が言いたいのは、ライブラリ側で取得するのは、やめられた方が良いということです。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2006-11-04 14:39
クリアなアドバイスに大感謝です。そうなのですね、では別の方向で考えようと思います。
いえいえ、そういうわけではありません。
すみません、この部分が今一まだわかっていません。私が思い描いているのはこんな感じなのですが、そうするとメソッドは1つにはならなくなってしまって。。 using CurrentApp; .... ClassA a = new ClassA("key"); string val = a.Value; // 同じアプリケーションのクラス // これが中間メソッド??(クラス??) using TestDLL namespace CurrentApp { class CurrentApp.ClassA { public ClassA ( string key ){ TestDLL.ClassA obj = new TestDLL.ClassA( CONNECTION_STRING, key ); ... // objをthisにコピー? } } } // In TestDLL class ClassA { string _val; public ClassA ( string connectionString, string key ){ SqlConnection cnn = new SqlConnection( connectionString ); SqlCommand cmd = new SqlCommand( "select val from test where key=@key", cnn ); cmd.Parameters.AddWithValue( "@key", key ); _val = cmd.ExecuteScalar(); } public string Value { get{ return _val; } } } [ メッセージ編集済み 編集者: Furi2 編集日時 2006-11-04 15:08 ] | ||||||||||||
|
投稿日時: 2006-11-04 15:04
[quote]
Furi2さんの書き込み (2006-11-04 14:39) より:
クリアなアドバイスに大感謝です。そうなのですね、では別の方向で考えようと思います。
いえいえ、そういうわけではありません。
すみません、この部分が今一まだわかっていません。私が思い描いているのはこんな感じなのですが、そうするとメソッドは1つにはならなくなってしまって。。 using CurrentApp; .... ClassA a = new ClassA("key"); string val = a.Value; // 同じアプリケーションのクラス // これが中間メソッド??(クラス??) using TestDLL namespace CurrentApp { class CurrentApp.ClassA { public ClassA ( string key ){ TestDLL.ClassA obj = new TestDLL.ClassA( CONNECTION_STRING, key ); ... // objをthisにコピー? } } } // In TestDLL class ClassA { string _val; public ClassA ( string connectionString, string key ){ SqlConnection cnn = new SqlConnection( connectionString ); SqlCommand cmd = new SqlCommand( "select val from test where key=@key", cnn ); cmd.Parameters.AddWithValue( "@key", key ); _val = cmd.ExecuteScalar(); } public string Value { get{ return _val; } } } | ||||||||||||
|
投稿日時: 2006-11-04 15:06
あれ、、編集しようとしたらコピーされてしまいました。。メッシーにしてすいません!!
| ||||||||||||
|
投稿日時: 2006-11-06 21:09
じゃんぬねっとさんのいいたいことかどうかわかりませんが・・
--------------------------
|