1

WebMethod DataSourceとしてAjaxAutoCompleteExtenderを提供するがあります。

FontnmsList_AutCpltDataSrc()

ですから、static別のアプローチで実装しない限り、それWeb Serviceは、使用したくないので、実際には、とにかくここでは問題ではありません。

したがって...静的メソッドであり、現在のアプリケーションの残りのデータと連携する必要があります...静的ではありません....ここに少し問題があります..

今、私は一般的に静的なものを使用しないようにアドバイスされているので(参照していたasp.net)、そしてそのアドバイスに従おうとしている間、

私はそれとの相互作用を可能にするために...ウェブメソッドは私が他のすべてのアプリケーション要素/データ型とメソッドをstatic修飾子を使用するように変換するように導いていることがわかりました、例えば、

これは私が現在のプロジェクトで出会った例です。

// non static 
public SeSn.CurrentSesionVariablsTmplt ExtractSesnVar()
{
    SeSn.CurrentSesionVariablsTmplt RetrndAppGlobals = SeSn.GetValueAS.ACloneOfGlobalsObj("_CurrentSesionGlobals");
    return (SeSn.CurrentSesionVariablsTmplt)RetrndAppGlobals ;

}

これがオートコンプリートエクステンダーを担当するWebメソッドです

public static List<string> FntsList = new List<string>();


[System.Web.Script.Services.ScriptMethod()]
[System.Web.Services.WebMethod(EnableSession = true)]

public static List<string> FontnmsList_AutCpltDataSrc(string prefixText)
{ 

    if (ExtrctSesnVar().Fntlist != null)
    { 
        //here too , non of these are , except for the List of course
        FntsList = RflectMeths.ClassFldsAsList<fntNams>();
        CurrSesnDatabag.Fntlist = FntsList;
        SeSn.Modify(Act.Add, App.VarNms._CurrentSesionGlobals, CurrSesnDatabag);
    }
    else
        FntsList = ExtractSesnVar().Fntlist;

    return AutoComplete.FromListStr(prefixText, FntsList);
}

したがって、内での作業には非静的ExtractSesnVar()が必要です

staticWebメソッドスコープFontnmsList_AutCpltDataSrc()

ですから、私は不思議に思います...ここで私が不足している基本的な知識は何ですか(:つまり、.netを学び始めたときに、このジャンクションに入ったことはありますか?

そして、SO A RealQuestionで何と呼ばれるかについて:

このシナリオの解決策としての回避策は何ですか(これは1つの例にすぎません。このような「ジャンクション」は他にもたくさんあるはずなので、思いつく可能性があります)

bridge書き込み中にこれら2つのエンティティの間に、静的ではないデータをパラメータとして渡すことを考えることができる、何らかの方法があるはずだと思う必要があります。

だから私はここで何が欠けていますか。上記のサブジェクトされたコードの正しい解決策は何ですか?

4

1 に答える 1

1

私はあなたが尋ねていると仮定しています:静的メソッドからインスタンスメソッドを呼び出すにはどうすればよいですか?

オプションは3つだけです。

  1. 必要なメソッドを持つオブジェクトの単一の静的インスタンスを作成できます。これは、このインスタンスをリセットできるか、状態を保持していない場合にのみ機能します。
  2. すべての呼び出しで新しいインスタンスを作成し、それを使用します。
  3. すべてを静的にします。(非推奨)

インスタンスメソッドが必要とする状態情報は、インスタンスから1つまたは2つだけである場合があります。その場合は、それらを静的に変換し、インスタンスメソッドに追加の状態情報を使用して静的メソッドを呼び出させる方が簡単です。ここでこれが当てはまるかどうかを確認してください。

たとえば、次のような非常に単純なクラスがあるとします。

public class something
{
  public int One { get;set; }
  public int Two { get;set; }

  public int Add()
  {
    return One + Two;
  }
}

Addを呼び出す必要のある静的メソッドがある場合は、上記のコードを以下のコードにリファクタリングできるため、静的メソッドでインスタンスを作成する必要はありませんが、Addロジックは1か所にあります。

public class something
{
  public int One { get;set; }
  public int Two { get;set; }

  public int Add()
  {
    return Add(One, Two);
  }

  internal static int Add(int one, int two) 
  {
    return one + two;
  }
}

静的Addメソッドを内部にすることを選択したので、アセンブリ内の他のクラスとフレンドアセンブリのみがそれを呼び出すことができます。シナリオで意味がある場合は、遠慮なく公開してください。

これはどれも理想的ではありませんが、あなたの場合は価値があるかもしれません。YMMV。

于 2012-12-17T00:14:12.987 に答える