1

我是 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 和存储库模式的新手并且只有一个测试项目,所以我不知道从长远来看我的解决方案是否会成为一个更大的问题。

任何建议都受到高度赞赏。

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 回答