2005年05月17日

ProxyAttribute

   このエントリーをはてなブックマークに追加 Clip to Evernote
ProxyAttribute を使うと、コンストラクタをトラップすることができます。
以下のソース(.NET Framework のヘルプのコードとほとんど同じものですが)を見て下さい。

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Contexts;

class Class {
[STAThread]
static void Main(string[] args) {
CustomServer cs = new CustomServer();
cs.Print("Hello");
Console.ReadLine();
}
}

[AttributeUsage(AttributeTargets.Class)]
public class MyProxyAttribute : ProxyAttribute {
public MyProxyAttribute() : base(){
}
public override MarshalByRefObject CreateInstance(Type serverType) {
Console.WriteLine("CreateInstance:" + serverType.FullName);
return base.CreateInstance(serverType);
}
}

[MyProxyAttribute]
public class CustomServer :ContextBoundObject {
public CustomServer() {
Console.WriteLine("Constructor called");
}
public void Print(string str) {
Console.WriteLine("Print Method: " + str);
}
}


ProxyAttributeから独自のクラスを派生させ、CreateInstanceをoverrideします。
この派生した属性クラスを付加した、クラス(ここではCustomServer)のインスタンスを new すると、CustomServerのコンストラクタが動く前に、先ほどの CreateInstanceが起動されます。
このコードでは、RemoteProxyを使っていませんが、前回のコードと組み合わせ、ここで、透過プロキシーを返すようにしてあげれば、クライアント(ここでは、Mainメソッド)側は、Proxyを生成していることを意識することなく、プロキシーを使うことができます。

ContextBoundObjectからCustomerクラスを派生させないといけないという制約はありますが、とても興味深い機能ですね。


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/22297134