2

私の mvc3 コントローラーでは、特定のオブジェクトがいくつかのメソッドで使用されています。コントローラーのメンバー変数として宣言し、それにアクセスするためのプロパティを提供する必要がありますか? しかし、アクション メソッドの 1 つがクライアントから呼び出されるたびに何が起こるのでしょうか? オブジェクトは何度も作成されますか? その場合、上記の方法に特に利点はありますか? この場合、MySpclClass をシングルトン クラスとして宣言するのは適切なオプションですか?

要するに、この方法を使用する利点はありますか?

 public class MyController : Controller
    {
         MySpclClass myObject=new MySpclClass();


        public ActionResult DoFirst(int id)
        {
          ....................
          myObject.doOneThing();
          ....................  
        }

        public ActionResult DoSecond(int id)
        {
          ....................
          myObject.doAnotherthing();
          ....................  
        }
    }

この方法について:

public class MyController : Controller
        {       

            public ActionResult DoFirst(int id)
            {
             MySpclClass myObject=new MySpclClass();
               ....................
              myObject.doOneThing();
              ....................  
            }

            public ActionResult DoSecond(int id)
            {
             MySpclClass myObject=new MySpclClass();                            
              ....................
              myObject.doAnotherthing();
              ....................  
            }
}

そして、これはどうですか:

 public class MyController : Controller
            {       

                 MySpclClass myObject;
                public ActionResult DoFirst(int id)
                {
                 myObject=new MySpclClass();
                   ....................
                  myObject.doOneThing();
                  ....................  
                }

                public ActionResult DoSecond(int id)
                {
                 myObject=new MySpclClass();                            
                  ....................
                  myObject.doAnotherthing();
                  ....................  
                }
    }

編集: MySpclClass をシングルトン クラスとして宣言していますか? Rajansoft1 が提案したように、この場合は適切なオプションですか? これに関する提案が必要です。

4

7 に答える 7

3

ActionResult1 つの要求で複数のメソッドを呼び出す場合を除き、利点はありません。

各リクエストはコントローラーの新しいインスタンスをインスタンス化するため、オブジェクトはその時点で再作成されます。

于 2013-05-29T10:53:08.100 に答える
3

依存性注入を使用して、これらの問題に対処できます。依存性注入に最適なツールの 1 つは ninject です。これは、オブジェクトのインスタンスを 1 回作成し、任意のコントローラーで必要なときにいつでもそれを提供します。一度設定するだけで済みます。

ninject を初めて使用する場合は、ここで見つけることができます http://www.ninject.org/

于 2013-05-29T10:53:12.410 に答える
1

2 番目のオプション (クラス レベル フィールドなし) は、フィールド値がリクエスト間で保存されているという印象を与えないため、最適です (フレームワークがリクエストごとに Controller インスタンスを再作成するため、そうではありません)。

ただし、ほとんどのメソッドでフィールドが使用されている場合は、フィールドの使用を検討できますが、このようにアクセスするためのプロパティを作成して、必要に応じて自動的にインスタンス化されるようにする必要があります (またはコンストラクターで常にフィールドをインスタンス化します)。

private MySpclClass myObject;
public MySpclClass MyObject
{
    get
    {
        if (this.myObject == null)
            this.myObject = new MySplClass();
        return this.myObject;
    }
}
于 2013-05-29T10:53:41.957 に答える
1

コントローラーがリクエストごとmyobjectに作成されるという事実を考慮すると、それらのリクエスト間で何らかの状態を保持する必要があるかどうかによってすべてが異なります。そのオブジェクトのインスタンス(デフォルト状態)だけが必要な場合は、他のアプローチよりも DRY であるため、最初のアプローチを使用します。

または、myobject単なるヘルパーの場合は、staticシングルトンにすることを検討できます。

于 2013-05-29T10:54:56.567 に答える
0

以下のコードを使用できます

public class MyController : Controller
{
 private readonly IMySpclClass _mySpclClass;
public void MyController(IMySpclClass mySpclClass)
{
     _mySpclClass = mySpclClass;
}
public ActionResult DoFirst(int id)
{
    _myObject.doOneThing(); // Set some properties on the model that are stored on the view as hiddenfields and will be posted back to the "DoSecond" action.
    return view("MyView", myObject);
}

[HttpPost]
public ActionResult DoSecond(MySpclClass myObject) 
{            
   _myObject.doAnotherthing(); // Uses the properties that where stored on the view and posted back again.
    return view("MyView", myObject);
}
}

 //and add the below code to ninject factor class

 _kernel.Bind<IMySpclClass >().To<MySpclClass >().InSingletonScope();

 //also intialize _kernel above as shown

 private static IKernel _kernel;
    public static void Register()
    {
        _kernel = new StandardKernel();
        AddBindings();
    }

    private static IKernel Instance
    {
        get { return _kernel; }
    }
     and write all the bindings in the AddBindings() function
于 2013-05-29T12:25:37.007 に答える