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 とリポジトリ パターンに慣れておらず、テスト プロジェクトしか持っていないため、長期的には私のソリューションがより大きな問題になるかどうかはわかりません。
どんなアドバイスでも大歓迎です。