1

IoC とリポジトリ パターンは初めてです。私はいくつかのテストプロジェクトを行うことができましたが、うまくいきました。しかし、私が実装したことが良い習慣であるかどうかはよくわかりません。私が作成したテスト プロジェクトには、すべてのリポジトリが配置されているだけでなく、ダミー データを使用する作業インターフェイスもあります。しかし、私が望むのは、最初のバージョンは MSSQL を使用して実装する必要があり、2 番目のバージョンは MSSQL と NoSQL (読み取りとログ用) の組み合わせになるため、プロジェクトがモデルの具体的な型を認識できないようにすることです。モデルには、MSSQL から NoSQL (または将来使用する可能性のあるもの) まで、さまざまなプロパティまたは構造がある可能性があります。

そこで、各モデルのインターフェースを作成しようとしました:

public interface ISearchResult
{
    string Id { get; set; }
    string Name { get; set; }
    string Description { get; set; }
    string Url { get; set; }
}

そして、ここにリポジトリがあります:

public interface ISearchRepository<T> where T: class, ISearchResult
{
    IEnumerable<T> Search<T>(string keyword, IEnumerable<string> regions, IEnumerable<string> industries,IEnumerable<string> countries, IEnumerable<string> cities, int offset);
}

そして、ここにサービスがあります:

public interface ISearchService
{
    IEnumerable<T> Search<T>(string keyword, IEnumerable<string> regions, IEnumerable<string> industries,IEnumerable<string> countries, IEnumerable<string> cities, int offset);
}

MSSQL または NoSQL エンティティがなくても GUI を動作させたいので、ISearchResult を継承するビュー モデルを作成しました。

public class SearchResultViewModel : ISearchResult
{
    [Display(Name="Reference Id")]
    public string Id { get; set; }
    [Display(Name = "Company")]
    public string Name { get; set; }
    [Display(Name = "Description")]
    public string Description { get; set; }
    [Display(Name = "Website")]
    public string Url { get; set; }
}

そして、これが私のコントローラーでどのように見えるかです:

[SearchQueryFilter]
[GeoTargetFilter]
public ActionResult Query(SearchQueryModel searchQuery)
{
     searchQuery.Results = this._searchService.Search<SearchResultViewModel>(searchQuery.Keyword,searchQuery.Region, new List<string>() { searchQuery.Industries }, new List<string>() { searchQuery.Countries}, new List<string>() {searchQuery.City}, searchQuery.Offset)
            .ToList<ISearchResult>();

        return View(searchQuery);
 }

そして、私の見解は次のようになります。

@foreach (SearchResultViewModel result in Model.Results)
{
     //code to display
}

私の質問は次のとおりです。このアプローチを使用しても問題ありませんか? Web アプリケーションをデータ エンティティに依存させたくないので、ビュー モデルにインターフェイスを継承させることにしました。また、私は IoC とリポジトリ パターンに慣れておらず、テスト プロジェクトしか持っていないため、長期的には私のソリューションがより大きな問題になるかどうかはわかりません。

どんなアドバイスでも大歓迎です。

4

1 に答える 1

2

Web アプリケーションとデータ エンティティを分離するために、ビュー モデルにインターフェイスを実装する必要はありません。ビュー モデルはWeb アプリケーションに属する必要があり、それ自体はデータ エンティティから独立している必要があります。

したがって、代わりに:

_searchService.Search<SearchResultViewModel>(x);

コントローラーに次のものが必要です。

var result = _searchService.Search<SomeEntity>(x);
var model = new SearchResultsViewModel
{
    Name = result.Name,
    Desc = result.Desc,
    Url = result.Url
};
return View(model);

ビュー モデルは Web アプリケーションに属し、コントローラーからビューに (およびその逆に) 渡されるデータを格納する責任があります。サービス層 (またはアプリケーションの他の層) とは関係ありません。

SomeEntity検索サービスが公開する形式の具象クラスです。コントローラーは、他のアプリケーションと同じ方法でこれを使用し、ビューとの間で受け渡しするためにビュー モデルをコンパイルします。最初SomeEntityとほぼ同じであることに気付くかもしれません。SearchResultsViewModelただし、ビューの要件は検索サービスとは無関係に変更される可能性があるため、それらは依然として別個のエンティティです。

于 2013-06-04T07:49:00.767 に答える