0

これがビューモデルを作成する正しい方法かどうか教えてください。私は Ninject を使用していますが、ビュー モデルを機能させる唯一の方法は、以下のコードを使用することです。

また、2番目のインターフェイスを作成しない限り、ビューモデルからコントローラーにデータを渡すことができないようです。

以下のコードは機能しますが、私が見たすべての例を読むと、ドメイン層から多くのコードを複製しているようです。

----------------------コード データ アクセス層------

    using System.Collections.Generic;
    using System.Configuration;
    using System.Data;
    using System.Data.SqlClient;

namespace Web.Domain.SearchEngine
    {
    public class DisplaySearchResults
        {
        public string Title         { get; set; }
        public string Description   { get; set; }
        public string URL           { get; set; }
        }
    public class GetSearchResults : IGetSearchResults
        {
        private string dbConn;

        public GetSearchResults()
            {
            dbConn = ConfigurationManager.ConnectionStrings["Search"].ConnectionString;
            }

        public IEnumerable<DisplaySearchResults> SearchResults(string q, string option, int pagenumber)
            {
            List<DisplaySearchResults> Data = new List<DisplaySearchResults>();
            string spName = "dbo.FTS_On_at_Websites";
            using (SqlConnection cn = new SqlConnection(dbConn))
                {
                using (SqlCommand cmd = new SqlCommand(spName, cn))
                    {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add(new SqlParameter("@strSearchPhrase", SqlDbType.VarChar, 100));
                    cmd.Parameters.Add(new SqlParameter("@SearchMode", SqlDbType.Int, 4));
                    cmd.Parameters.Add(new SqlParameter("@intPageNumber", SqlDbType.Int));
                    cmd.Parameters.Add(new SqlParameter("@intRecordsPerPage", SqlDbType.Int));
                    cmd.Parameters.Add(new SqlParameter("@intTotalRecordsReturned", SqlDbType.Int));
                    cmd.Parameters["@strSearchPhrase"].Value = q;
                    cmd.Parameters["@SearchMode"].Value = 1;
                    cmd.Parameters["@intPageNumber"].Value = pagenumber;
                    cmd.Parameters["@intRecordsPerPage"].Value = 10;
                    cmd.Parameters["@intTotalRecordsReturned"].Value = 10;

                    cn.Open();
                    using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.Default))
                        {
                        if (rdr.HasRows)
                            {
                            while (rdr.Read())
                                {
                                Data.Add(new DisplaySearchResults
                                {
                                    Title           = (string)rdr["PageTitle"],
                                    Description     = (string)rdr["PageParagraph"],
                                    URL             = (string)rdr["PageURL"]
                                });
                                }
                            }
                        return Data;
                        }
                    }
                }
            }
        }
    }

-------------コードViewModel--------------------

    using Microsoft.Security.Application;
    using System.Collections.Generic;
    using System.Linq;
    using Web.Domain.SearchEngine;

namespace Web.UI.ModelHelpers.Search
    {
    public class DisplaySearchResultsViewModel
        {
        public string Title         { get; set; }
        public string Description   { get; set; }
        public string URL           { get; set; }
        }

    public class GetSearchResultsViewModel : IGetSearchResultsViewModel
        {
        private readonly IGetSearchResults _IGSR;
        public GetSearchResultsViewModel(IGetSearchResults IGSR)
            {
            _IGSR = IGSR;
            }

        public IEnumerable<DisplaySearchResultsViewModel> SearchResultsViewModel(string q, string option, int pagenumber)
            {
            var searchResults = _IGSR.SearchResults(q, option, pagenumber).AsEnumerable();

            List<DisplaySearchResultsViewModel> GetData = new List<DisplaySearchResultsViewModel>();

            foreach (var details in searchResults.AsEnumerable())
                {
                GetData.Add(new DisplaySearchResultsViewModel()
                {
                    Title           = Sanitizer.GetSafeHtmlFragment(details.Title),
                    Description     = Sanitizer.GetSafeHtmlFragment(details.Description).ToLower(),
                    URL             = Sanitizer.GetSafeHtmlFragment(details.URL),
                });
                }
            return GetData;
            }
        }
    }

私が持っているコントローラーで

var DisplaySearchResults    = _IGSR.SearchResultsViewModel(cleanText, "1", 1);
4

1 に答える 1

3

いいえ、これはビュー モデルを構築する正しい方法ではありません。ビュー モデルには、データ アクセス ロジックを含めないでください。それがモデルの責任です。

代わりに、Ninject を使用して、ビュー モデルにコンストラクターの依存関係IGetSearchResultsを持たせる代わりに、インスタンスをコントローラーに挿入する必要があります。GetSearchResultsViewModel実際には、これはまったく必要ありませんGetSearchResultsViewModel。という正しいビュー モデルが既にありますDisplaySearchResultsViewModel。次に、データ アクセス レイヤーを使用してこのビュー モデルを構築するのはコントローラーの役割です。

例えば:

public class SomeController : Controller
{
    private readonly IGetSearchResults repository;
    public SomeController(IGetSearchResults repository)
    {
        this.repository = repository;
    }

    public ActionResult SomeAction(string q, string option, int pagenumber)
    {
        // query your data access layer and build the view model that you will
        // pass to the view
        IEnumerable<DisplaySearchResultsViewModel> model = this.repository
            .SearchResults(q, option, pagenumber)
            .AsEnumerable()
            .Select(details => new DisplaySearchResultsViewModel
            {
                Title = Sanitizer.GetSafeHtmlFragment(details.Title),
                Description = Sanitizer.GetSafeHtmlFragment(details.Description).ToLower(),
                URL = Sanitizer.GetSafeHtmlFragment(details.URL)
            })
            .ToList();

         return View(model);
    }
}
于 2013-02-26T11:59:34.160 に答える