2017-11-17 30 views
0

特定のソフトウェア設計状況で何をすべきかわかりません。ちょうど解決のためのインターネットを捜したが、満足のいく答えを見つけなかった。だから私はあなたの専門知識を知りたいだけでなく、何が最善のものかを知りたい。 私はいくつかの抽象レイヤーを持つシステムを持っています。ユーザーに表示されるAPIは、コンパクトな数のメソッドを持つ単純なクラスです。これらのメソッドを呼び出すと、抽象化全体を通してメソッド呼び出しの雪崩が引き起こされます。その途中である種の決断が下されるでしょう。この方法の各要素は、メッセージシステムを介してその宣言の理由とその理由を誰にでも伝えることができます。システムはまた、すべてのコールとデシジョンを記録しています。これは非常に重要です。むしろ最も重要です。正直言ってそれが核心の問題です。デザインパターントラッキングメソッド呼び出し/呼び出し側

問題は:WHOが特定のメソッドを呼び出したことを知りたい。だから私は何とか手を差し伸べることができ、すべての抽象化は知っている: "そう、この男はそれを望んでいる。だから私はログすることができます:この男はそれを望んでいた。

私はこれが必要だと信じている理由は、他のシステムがそのAPIを使用できるからです。おそらくGUIがコマンドをドロップしようとしているかもしれません。おそらくHTTPで駆動されるリモートコントローラかもしれません。

私は、システムがWHOに基づいて脱退するようにしたくないです。私はそれが私がすべてのthouseの層を抽象化することを意図したものの絶対的な反対であることを知っています。私はちょうど適切に記録したい。 WHOはWHATをしたかったのです。

今は木の木が見えません。私は、オブジェクトインスタンスのようなチケットをAPIに渡しました。システムはそのチケットをIDで登録しています。 APIユーザーは、コマンドを呼び出すときにチケットを渡して、システムが呼び出した人を知るようにする必要があります。

よく質問してください。 メソッドの呼び出し元を追跡/識別するためのパターンはありますか?

編集: この状況で使用されている一般的な問題ですが、C#!これまでのところ...私の現在のソリューションは魅力のように働いている

public void SomeMethod(string name, [CallerMemberName] string callerName = null) 
{ 
    Console.Writeline($"SomeMethod was called from {callerName}"); 
    ... 
} 

答えて

0

あなたが[CallerMemberName]属性を使用することができます。しかし、私はそれが悪い習慣と見なされるかどうかを知りたい、またはボトルネックが最初の一見を形作るのを見るかもしれないかどうかを知りたい。

//< API user will call this kind of method handing in their requested Accessor! 
    public void Command(int a, int b, KomiAccessorBase accessor=null){ 
     if(!AccessGranted(accessor)) return; 
     this.SubController.CommandA(a, b , accessor); 
    } 

    //< Accessor is checked on validity 
    private bool AccessGranted(KomiAccessorBase accessor, [CallerMemberName] string callerName = null) { 
     if (accessor == null) { 
      log("KOMI - Access to ["+callerName+"] denied: No Accessor handed in!", MsgType.LOG); 
      return false; 
     } 
     if (!_kacc_inventory.ContainsKey(accessor.KACCHashId)) { 
      log("KOMI - Access to [" + callerName + "] denied: Accessor not registered in KOMI!", MsgType.LOG); 
      return false; 
     } 
     return true; 
    } 

    protected Dictionary<int, KomiAccessorBase> _kacc_inventory = new Dictionary<int, KomiAccessorBase>(); 

    //< The Accessor base class. API user have to derive from that! 
    public abstract class KomiAccessorBase : RecieverBase, INameable { 
     public int KACCHashId { get; private set; } 
     private string _name; 
     public string Name { 
      get { 
       return _name; 
      } 
      private set { 

      } 
     } 
     protected KomiAccessorBase(string name, KOMI komi) : base(komi.Office) { 
      Name = name; 
      KACCHashId = -1; 
      KACCHashId = komi.RegisterAccessor(this); //Perform the real registration 
     } 
    } 

    //< Registeres the Accessor on KOMI for access checking! 
    public int RegisterAccessor(KomiAccessorBase acc) { 
     if (acc.KACCHashId != -1) return -1; //Abbort registration if already registered! 
     int salt = 1; 
     int hashId = (salt + "#" + acc.Name).GetHashCode(); 
     while (_kacc_inventory.ContainsKey(hashId)) { 
      salt++; 
      hashId = (salt + "#" + acc.Name).GetHashCode(); 
     } 
     _kacc_inventory.Add(hashId, acc); 
     return hashId; 
    } 
+0

ありがとうございました。これでメンバー名がわかりますが、それはまずは​​良いステップです。特にこれ以上の条件は必要ないためです。それらの言葉をちょうど追加する...かなり良い。 それでも問題は、GuiがメソッドQWERTYCallMethodを介して呼び出し、純粋な事故によって同じメソッドがWebコントローラからAPIを呼び出すために使用されることです。 – kaymcray