- PR -

WebアプリのDLLとWindowsアプリのDLL

投稿者投稿内容
Furi2
ベテラン
会議室デビュー日: 2004/10/28
投稿数: 74
お住まい・勤務地: N.Hollywood/Agoura Hills
投稿日時: 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と一緒に置いても、ファイルが見つからない、とエラーになります。

何か良い方法がありましたらお知恵をいただけないでしょうか。もしくは何か、そもそも根本から発想が間違っている、ということなどありますでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-04 11:42
引用:

Furi2さんの書き込み (2006-11-04 09:36) より:

しかし、Windowsアプリではちゃんと読み込むのですが、ASP.NETで呼び出すと、DLLをテンポラリーな場所にコピーしてロードするらしく、もちろんbinフォルダにそのXMLファイルをDLLと一緒に置いても、ファイルが見つからない、とエラーになります。


「CodeBase プロパティ」 で、こちらの会議室を検索してください。
と言いたいところなのですが、*.config を使った方が、まだ良いのではないかと思います。

汎用性を重視するのであれば、引数でしょう。
なぜ、"Connection String の値を渡すのもどうかと思った" のかが、いまいちわかりません。
指定するのが面倒であれば、接続用の中間メソッドを各案件ごとに書くだけで済むと思います。
その中間メソッドを呼び出すのに引数は不要です。

何でもかんでもライブラリで解決しようとすると、汎用性が薄くなります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Furi2
ベテラン
会議室デビュー日: 2004/10/28
投稿数: 74
お住まい・勤務地: N.Hollywood/Agoura Hills
投稿日時: 2006-11-04 13:57
どうもありがとうございます。頂いたアドバイスに従ってもう一度調べてみることにします。

そのライブラリに、例にあげたようなDB接続用のクラスと、その接続用のクラスを使ったすべてのクラス(多分20個くらい、こちらが直接アプリケーションから使われる)が入るのですが、すべてのクラスのコンストラクタとすべてのスタティック・メソッドにConnectionStringを引数で指定するほうがいいのでしょうか?中間メソッドというのに今一ピンときてなくて申し訳ないのですが、とすると、中間メソッドは、クラス20個分作る、という感じになるのでしょうか?

変な質問をしていたら大変もうしわけありません。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-04 14:07
引用:

Furi2さんの書き込み (2006-11-04 13:57) より:

そのライブラリに、例にあげたようなDB接続用のクラスと、その接続用のクラスを使ったすべてのクラス(多分20個くらい、こちらが直接アプリケーションから使われる)が入るのですが、すべてのクラスのコンストラクタとすべてのスタティック・メソッドにConnectionStringを引数で指定するほうがいいのでしょうか?


個人的には、そう思っています。
クラスが 20 あろうと 200 あろうと中間メソッドは 1 つなので、何ら問題ないと思います。

引用:

中間メソッドというのに今一ピンときてなくて申し訳ないのですが、とすると、中間メソッドは、クラス20個分作る、という感じになるのでしょうか?


いわゆる 「共通で使うモジュール」 に当たる部分に書いておけば良いと思います。
それとも、クラスによって接続文字列が変わって、それが 20 通りあるということなのでしょうか?

また、中間メソッドで外部ファイルから動的に ConnectionString を取得するというのもアリでしょう。
私が言いたいのは、ライブラリ側で取得するのは、やめられた方が良いということです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Furi2
ベテラン
会議室デビュー日: 2004/10/28
投稿数: 74
お住まい・勤務地: N.Hollywood/Agoura Hills
投稿日時: 2006-11-04 14:39
引用:

私が言いたいのは、ライブラリ側で取得するのは、やめられた方が良いということです。



クリアなアドバイスに大感謝です。そうなのですね、では別の方向で考えようと思います。


引用:

それとも、クラスによって接続文字列が変わって、それが 20 通りあるということなのでしょうか?


いえいえ、そういうわけではありません。

引用:

クラスが 20 あろうと 200 あろうと中間メソッドは 1 つなので、何ら問題ないと思います。



すみません、この部分が今一まだわかっていません。私が思い描いているのはこんな感じなのですが、そうするとメソッドは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 ]
Furi2
ベテラン
会議室デビュー日: 2004/10/28
投稿数: 74
お住まい・勤務地: N.Hollywood/Agoura Hills
投稿日時: 2006-11-04 15:04
[quote]
Furi2さんの書き込み (2006-11-04 14:39) より:
引用:

私が言いたいのは、ライブラリ側で取得するのは、やめられた方が良いということです。



クリアなアドバイスに大感謝です。そうなのですね、では別の方向で考えようと思います。


引用:

それとも、クラスによって接続文字列が変わって、それが 20 通りあるということなのでしょうか?


いえいえ、そういうわけではありません。

引用:

クラスが 20 あろうと 200 あろうと中間メソッドは 1 つなので、何ら問題ないと思います。



すみません、この部分が今一まだわかっていません。私が思い描いているのはこんな感じなのですが、そうするとメソッドは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
ベテラン
会議室デビュー日: 2004/10/28
投稿数: 74
お住まい・勤務地: N.Hollywood/Agoura Hills
投稿日時: 2006-11-04 15:06
あれ、、編集しようとしたらコピーされてしまいました。。メッシーにしてすいません!!
sou
ベテラン
会議室デビュー日: 2002/09/25
投稿数: 56
投稿日時: 2006-11-06 21:09
じゃんぬねっとさんのいいたいことかどうかわかりませんが・・

コード:
//ライブラリ側のクラス
public class DataBaseConnection 
{
    private static string CNN_STRING;
    
    public static string SetConnectionString(string v)
    {
        CNN_STRING = v;
    }

    public static DataBaseConnection(string path) 
    { 
        XmlDocument xml = new XmlDocument(); 
        xml.Load( path ); 
        XmlNode root = xml.DocumentElement; 
        string xpath = "ConnectionString"; 
        XmlNode node = root.SelectSingleNode(xpath); 
        SetConnectionString(node.Attributes["Value"].Value.ToString()); 
    } 

    public static DbConnection CreateDbConnection() 
    { 
        DbConnection cnn = new SqlConnection( CNN_STRING ); 
        return cnn; 
    } 

}



--------------------------
コード:
//利用する側のクラス

DataBaseConnection.SetConnectionString("server=myServer;database=myDb・・");
//もしくは
DataBaseConnection.DataBaseConnection("DbInfo.xml");

//どちらかのメソッドで接続文字列をライブラリに渡す


スキルアップ/キャリアアップ(JOB@IT)