0

AddressプロパティおよびLatitude/プロパティを含むモデルがありLongitudeます。モデルは「作成」ビューに入力され、他のほとんどのフィールドに入力されます。入力した住所に基づいてGoogleMapsAPIジオコーディング機能を使用してLat/Lngにデータを入力します(手動で入力させる意味はありません)。

私の大きな質問は、これをどこで行うべきかということです。以下のコードは機能しますが、かなり不格好だと思います。この動作を統合するためのより良い方法について何か考えはありますか?それはコントローラーにあるべきですか?それはいくつかの内部モデルメカニズムの一部である必要がありますか?

[HttpPost]
public ActionResult Create(Church church)
{
    try
    {
        if (ModelState.IsValid)
        {
            string address = string.Format("{0},{1},{2} {3}", 
                church.Street + church.Street2, church.City,
                church.Region, church.PostalCode);

            JObject jsonResult = GoogleApiHelper.GetAddressGeocodeData(address);

            //Handle some error states here...
            if (jsonResult["results"].Count() == 1)
            {
                church.Latitude = jsonResult.SelectToken(        
                    "results[0].geometry.location.lat").Value<double>();
                church.Longitude = jsonResult.SelectToken(
                    "results[0].geometry.location.lng").Value<double>();
                unitOfWork.ChurchRepository.Insert(church);
                unitOfWork.Save();
                return RedirectToAction("Index");
            }              
        }
    }
    catch (DataException)
    {
        //Log the error (add a variable name after DataException)
        ModelState.AddModelError("", "Unable to save changes.");
    }
    return View(church);
}
4

3 に答える 3

2

リポジトリレイヤーを使用してGoogleAPIへのアクセスを抽象化し、コントローラーからこのリポジトリを呼び出して、既に入力されているモデルを取得できます。このように、明日Googleの代わりにBingを使用することにした場合、変更する必要があるのはリポジトリの実装だけです。コントローラやモデルロジックに触れる必要はありません。

于 2012-06-25T13:49:32.540 に答える
0

カスタムモデルバインダーを作成し、そこにすべてのGoogleAPIコードを配置できます。そうすれば、コントローラーはデータアクセスを完全に認識しなくなります。

カスタムモデルバインダーに関するチュートリアルは次のとおりです。

http://buildstarted.com/2010/09/12/custom-model-binders-in-mvc-3-with-imodelbinder/

于 2012-06-25T13:55:59.303 に答える
0

主な質問は、他の場所に教会を作るつもりですか?

そうでない場合、これはコードを配置するのに完全に受け入れられる場所です。

次に、両方の場所から呼び出すことができるChurchServiceにコードを配置します。そうすれば、コードを過度に複雑にすることなく、DRY(Do n't Repeat Yourself)の原則を守ることができます。

于 2012-06-25T13:57:10.123 に答える