C#の属性

C#で、データベースにアクセスするクラスライブラリを作ってたとき

using System.EnterpriseServices;
using System.Runtime.InteropServices;
[JustInTimeActivation(true)]
[Transaction(TransactionOption.Required), ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("FCDE681F-8E18-4186-9AEB-87873903E28F")]
public class ShippingGateway :  ServicedComponent {
}

こんなクラスを大量に作ってたので、属性とか書くのが面倒になってきて、全部抽象クラスに属性を書いてGUIDだけ、派生クラスに書けばいいかー。と、やってみたらダメだった(´Д`;)ヾ。まあ、いろんな書籍のサンプルコードを見ても、派生クラスでもフルセット記述してるのでダメっぽいなと思ってたんですけどね・・・。
あと、新しいCOM+コンポーネントのクラスを増設したときに、そのクラスのメソッドにアクセスするとアプリケーションエラーになるとこ。ASP.NETから使うコンポーネントだと、RegSvcsで登録しても、すぐには使えず、IISとかを一度止めて起動しなおさないと使えない。めんどい。
それから、他の人が書いてたコードで、DBにアクセスするコードに全部、[AutoComplete]の属性が付いてたんで、真似して書いてたら、だめじょん。状態を保持するようなクラスだと、[AutoComplete]付きのメソッドを呼んだ時点でコミットされるからなのか、かならずコンストラクタが呼ばれちゃう。


public class testClass : ServicedComponent {
private int state;
public test() {
state = 1;
}
public int State {
get { return state; }
set { state = value; }
}
[AutoComplete(true)]
public void testMethod1() {
state += 1;
}
[AutoComplete(true)]
public void testMethod2() {
state += 2;
}
}
testClass test = new testClass();
Console.Write( "State = {0}", test.State );
test.testMethod1();
Console.Write( "State = {0}", test.State );
test.testMethod2();
Console.Write( "State = {0}", test.State );

これ実行したら、
State = 1
State = 2
State = 4
とかになるかなーと思ってたら
State = 1
State = 1
State = 1
でした。
[AutoComplete]を外すと
State = 1
State = 2
State = 4
になります。
それぞれのメソッドを実行した後に、Stateプロパティにアクセスすると、testClassのコンストラクタが実行されちゃうのでした。トランザクションが一度コミットされて、新たにトランザクションを開始する感じなのかなぁ。コミットされると、トランザクションに参加してたインスタンスはDisposeされちゃうんでしょうか・・・。
ということで、デストラクタを書いてみた。


public class testClass : ServicedComponent {
private int state;
public test() {
state = 1;
}
~test() {
Console.Write("Destructor");
}
public int State {
get { return state; }
set { state = value; }
}
[AutoComplete(true)]
public void testMethod1() {
state += 1;
}
[AutoComplete(true)]
public void testMethod2() {
state += 2;
}
}

結果
State = 1
Destructor
State = 1
Destructor
State = 1
Destructor
ふーむ。ContextUtil.SetComplete()した後のクラスは作り直されてるとか、コピーを使わされてるとかですかね。オブジェクトプーリングとか、そのへんかな、いまいちわかんね。ま、こんなコードは誰も書かないんだろうけど。

コメント

タイトルとURLをコピーしました