3

多くのデリゲート/関数の例があることは知っていますが、うまくいく例が見つからないか、単にそれらを理解していません。

Web サイトに asp.net MVC を使用しています。Web サイトには、外部アプリケーションがアプリと対話するための Web サービス呼び出しが必要です。これらはすべて、実行する関数 (db などに移動する) が必要であり、毎回同様のデータ モデルを返します。各呼び出しを try/catch でラップし、モデルに入力したいと考えています。

以下は、すべての呼び出しで発生する一般的なコードです。

var model = new ResponseDataModel();
try
{
     //execute different code here
}
catch (Exception ex)
{
    model.Error = true;
    model.Message = ex.ToString();
}
return View(model); // will return JSON or XML depending on what the caller specifies

これは、私が使用しているコントローラーメソッド/関数の1つです

public ActionResult MillRequestCoil()
{
    var model = new ResponseDataModel();
    try
    {
        /* edit */
        //specific code
        string coilId = "CC12345";

        //additional code
        model.Data = dataRepository.doSomethingToCoil(coilId);

        //replaced code
        //model.Data = new { Coil = coilId, M3 = "m3 message", M5 = "m5 message" };
        model.Message = string.Format("Coil {0} sent successfully", coilId);
    }
    catch (Exception ex)
    {
         model.Error = true;
         model.Message = ex.ToString();
    }
    return View(model);
}

特定の関数を変数に変換して、汎用コードに渡すことができるようにしたいと考えています。デリゲートと匿名関数を見てきましたが、自分でやるまではかなり混乱します。

4

3 に答える 3

6

次のものをアクセス可能な場所に置きます。

public static ActionResult SafeViewFromModel(
    Action<ResponseDataModel> setUpModel)
{
    var model = new ResponseDataModel();
    try
    {
        setUpModel(model);
    }
    catch (Exception ex)
    {
        model.Error = true;
        model.Message = ex.ToString();
    }
    return View(model); 
}

そしてそれを次のように呼び出します:

public ActionResult MillRequestCoil()
{
    return MyHelperClass.SafeViewFromModel(model =>
    {
        string coilId = "CC12345";
        model.Data = new {
            Coil = coilId,
            M3 = "m3 message",
            M5 = "m5 message" };
        model.Message = string.Format("Coil {0} sent successfully", coilId);
    });
}
于 2012-09-04T14:15:02.863 に答える
1
public interface IAction{
    public void doAction(ResponseDataModel model);
}

public class Action1 : IAction
{
    public void doAction(ResponseDataModel model)
    {
        string coilId = "CC12345";
        model.Data = new { Coil = coilId, M3 = "m3 message", M5 = "m5 message" };
        model.Message = string.Format("Coil {0} sent successfully", coilId);
    }
}

class Class1
{
    public ActionResult MillRequestCoil(IAction action)
    {
        var model = new ResponseDataModel();
        try
        {
            //specific code
            action.doAction(model);
        }
        catch (Exception ex)
        {
            model.Error = true;
            model.Message = ex.ToString();
        }
        return View(model);
    }
}

使用する:

var result = MillRequestCoil(new Action1());

または他のコードを実行する

var result = MillRequestCoil(new ActionXY());
于 2012-09-04T14:22:38.143 に答える
0

これはローリングの答えのバリエーションであり、読みやすさが向上していると思います。

public ActionResult MillRequestCoil()
{
    var model = CreateResponseDataModel(RunSpecificCode);

    return View(model);
}

public ActionResult MillDoSomethingElse ()
{
    var model = CreateResponseDataModel(RunOtherCode);

    return View(model);
}

private ResponseDataModel CreateResponseDataModel(Action<ResponseDataModel> action)
{
    var model = new ResponseDataModel();
    try
    {
        action(model);
    }
    catch (Exception ex)
    {
        model.Error = true;
        model.Message = ex.ToString();
    }
    return model;
}

private void RunSpecificCode(ResponseDataModel model)
{
    /* edit */
    //specific code
    const string coilId = "CC12345";

    //additional code
    model.Data = _dataRepository.DoSomethingToCoil(coilId);

    //replaced code
    //model.Data = new { Coil = coilId, M3 = "m3 message", M5 = "m5 message" };
    model.Message = string.Format("Coil {0} sent successfully", coilId);
}

private void RunOtherCode(ResponseDataModel obj)
{
    // some other piece of code
}

ラムダがなく、特定のコードと、try/catch およびモデル構築用のテンプレート コードとの間の懸念事項が適切に分離されています。

于 2012-09-04T15:03:43.277 に答える