簡體   English   中英

模型繼承-使用IoC的存儲庫模式

[英]Model inheritance - Repository Pattern with IoC

我是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和Repository Pattern的新手,並且只有一個測試項目,所以我不知道從長遠來看我的解決方案是否會成為更多問題。

任何建議都受到高度贊賞。

您無需在視圖模型中實現接口即可在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 SomeEntity相同; 但是,它們仍然是不同的實體,因為視圖的要求可能會獨立於搜索服務而改變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM