我是 IoC 和存储库模式的新手。我能够做一些测试项目并且它有效。但是,我不太确定我实施的是否是一个好的做法。我创建的测试项目具有所有存储库以及带有虚拟数据的工作界面。但我想要的是我的项目不应该能够知道我的模型的具体类型,因为初始版本应该使用 MSSQL 实现,而第二个版本将是 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 和存储库模式的新手并且只有一个测试项目,所以我不知道从长远来看我的解决方案是否会成为一个更大的问题。
任何建议都受到高度赞赏。