私が持っているとしましょう
public delegate DataSet AutoCompleteDelegate(
string filter, long rowOffset);
そのメソッド署名を強制するために次のクラスを作成できますか? (ただ思いついたアイデア):
public class MiddleTier
{
[Follow(AutoCompleteDelegate)]
public DataSet Customer_AutoComplete(string filter, long rowOffset)
{
var c = Connect();
// some code here
}
[Follow(AutoCompleteDelegate)]
public DataSet Item_AutoComplete(string filter, long rowOffset)
{
var c = Connect();
// some code here
}
// this should give compilation error, doesn't follow method signature
[Follow(AutoCompleteDelegate)]
public DataSet BranchOffice_AutoComplete(string filter, string rowOffset)
{
var c = Connect();
// some code here
}
}
[編集]
目的: 私はすでに中間層のメソッドに属性を入れています。私はこのような方法を持っています:
public abstract class MiddleTier : MarshalByRefObject
{
// Operation.Save is just an enum
[Task("Invoice", Operation.Save)]
public Invoice_Save(object pk, DataSet delta);
[Task("Receipt", Operation.Save)]
public Receipt_Save(object pk, DataSet delta);
// compiler cannot flag if someone deviates from team's standard
[Task("Receipt", Operation.Save)]
public Receipt_Save(object pk, object[] delta);
}
次に、実行時に、すべての中間層のメソッドを反復してコレクションに配置し (ここでは属性が非常に役立ちます)、それらを winform のデリゲート関数 (インターフェイス、プラグインベースのシステムによって促進されます) にマップします。
コンパイラが矛盾をキャッチできるように、属性をより自己記述的にできるかどうかを考えています。
namespace Craft
{
// public delegate DataSet SaveDelegate(object pk, DataSet delta); // defined in TaskAttribute
public abstract class MiddleTier : MarshalByRefObject
{
[Task("Invoice", SaveDelegate)]
public abstract Invoice_Save(object pk, DataSet delta);
[Task("Receipt", SaveDelegate)]
// it's nice if the compiler can flag an error
public abstract Receipt_Save(object pk, object[] delta);
}
}
各クラスにメソッドを配置すると、常に Remoting オブジェクトをインスタンス化するのはやり過ぎになると思います。それらを別のクラスに置くと、コードの再利用を促進するのが難しくなる可能性があります。たとえば、Invoice_Save が Receipt_Open に関する情報を必要としているとします。実際、呼び出されたメソッド内でリモーティング中間層 DataSet からデータを取得したレポート (crystal) さえあります。他のメソッドに関する情報を取得し、独自の DataSet にマージします。それらはすべて中間層で発生しており、いくつかのラウンドトリップはありません。すべてがサーバー側(中間層)で行われます