2

長年 Web フォームを作成した後、MVC に移行しようとしています。Datatables から離れて、モデル クラスを適切に作成する方法を理解するのに苦労しています。大きな問題は、私のデータソースが XML を返す安らかな Web サービスであることです。

現在、ビューのモデルをデータテーブルとして強く入力しています。モデルクラスを使用しないことで何かをあきらめているのですか? コントローラーに多くの情報を含めていますか?

以下は、クエリ文字列の値を取得し、安静な Web サービスを使用して検索を実行し、ページに結果を出力する単純なアプリケーションです。動作しますが、実際の MVC アプリケーションを作成したような気がしません。

私のコントローラー:

using System.Web.Mvc;
using System.Data;
using System.Configuration;

namespace mvc1.Controllers
{
    public class HomeController : Controller
    {
        dhRestful _datahandler = new dhRestful(ConfigurationManager.ConnectionStrings["service"].ConnectionString);

        //
        // GET: /Home/
        public ActionResult Index(string search = "")
        {
            ViewBag.Title = "You searched for: " + search;

            using (DataTable dt = _datahandler.get("tv_show?name=" + search))
            {
                return View(dt);
            }
        }

    }
}

dhRestful は、以前のプロジェクトから移植したヘルパー クラスです。安らかな Web サービス呼び出しを行い、応答 XML を DataTable にシリアル化します。このクラスを引き続き使用する必要がある場合、プロジェクト ファイルのどこに配置すればよいですか?

using System.Data;
using System.Xml;

namespace mvc1
{
    public class dhRestful
    {
        string _hostPath = "";

        public dhRestful(string hostPath)
        {
            _hostPath = hostPath;
        }

        public DataTable get(string partialUrl)
        {
            using (XmlTextReader xr = new XmlTextReader(_hostPath + partialUrl))
            {
                using (DataSet ds = new DataSet())
                {
                    ds.ReadXml(xr);

                    if (ds.Tables.Count > 0)
                    {
                        return ds.Tables[0];
                    }
                    else
                    {
                        return new DataTable();
                    }
                }
            }
        }
    }
}

かみそりを使用したビュー:

@model System.Data.DataTable

<h2>@ViewBag.Title</h2>

<table border="1">
    <thead>
        <tr>
            <th>ID</th>
            <th>Show Name</th>
        </tr>
    </thead>
    <tbody>
        @foreach (System.Data.DataRow row in Model.Rows)
        {
            <tr>
                <td>@row["id"].ToString()</td>
                <td>@row["name"].ToString()</td>
            </tr>
        }       
    </tbody>
</table>

「Stargate」という名前で検索された XML の例:

<myService>
  <tv_show>
    <id>72449</id>
    <name>Stargate SG-1 </name>
  </tv_show>
  <tv_show>
    <id>83237</id>
    <name>Stargate Universe </name>
  </tv_show>
  <tv_show>
    <id>70852</id>
    <name>Stargate: Infinity </name>
  </tv_show>
  <tv_show>
    <id>70851</id>
    <name>Stargate Atlantis </name>
  </tv_show>
</myService>
4

1 に答える 1

3

コンポジションルートで、依存性注入を介してこのデータアクセスレイヤーを作成することをお勧めします。したがって、後で残りのクライアントの代わりに、契約を満たす別のクライアントを注入できます。

もう 1 つの注意点は、ビュー モデルを作成することです。アプリケーション内で直接使用している VO または DTO の場合は、それらをラップすることをお勧めします。これがあなたの答えだと思います。モデルフォルダーにモデルを表示するか、サブフォルダーなどを作成できます。

このようなもの:

   // you need to adjust your dependency accordingly
   Interface IRepository<T> : where t has a value
   {
     void Set(T item);
     T Get(some value that you indicate in T);
   }

    namespace mvc1.Controllers
    {
        public class HomeController : Controller
        {
            IRepository<SomeObject> _repo;

            public HomeController(IRepository<SomeObject> repository)
            {
               _repo = repository;
            }             


            //
            // GET: /Home/
            public ActionResult Index(string search = "")
            {
                ViewBag.Title = "You searched for: " + search;

                using (SomeObject obj = _repo.get("tv_show?name=" + search))
                {
                    // here you can use automapper to map a DTO or VO to View model.
                    FooViewModel model = someobject;
                    return View(model);
                }
            }

        }
    }

コンポジション ルート: global.asax で、コンテナーをブートストラップできます。これには多くの方法があります。構造マップとコンテナの使用方法を見てください。

于 2012-06-12T22:13:56.023 に答える