我用我的asp.net核心web api使用弹性搜索。当涉及到仓库责任时,我不太清楚界线在哪里。存储库模式是如何真正完成的?
下面是我定义我的实现:
public SearchRespository: ISearchRespository<Product>
{
private ElasticClient _client
public async Task<ISearchResponse<Product>> SearchAsync(ISearchRequest request)
{
var response = _client.SearchAsync<Product>(request);
return await products;
}
. . . // others
}
在我的控制器:
public SearchController : Controller
{
private ISearchRespository _repo;
public SearchController(ISearchRespository repo)
{
_repo = repo;
}
public async Task<IActionResult> Search()
{
// build my search request from Request.Query
var response = await _client.SearchAsync(request);
var model = new SearchModel
{
Products = response.Documents;
Aggregations = response.Aggregations;
}
return Ok(model)
}
因为它代表的回购协议通过弹性响应为是。我的问题是我画了我的线吗?如果我只是将_client
移动到我的控制器或移动建筑物请求并将model
设置为_repo
?你们如何让你的资料库正确?
我建议你在codereview.stackexchange.com中提出这个问题 –
那么,存储库的目的是抽象出持久性。我假设'ISearchResponse'和'ISearchRequest'是弹性搜索接口。不应该在'ISearchRespository'上定义它们,因为那么你的持久性会泄漏到你的业务/域层。在这里你应该使用自己的类,或者如果你的搜索请求足够简单,使用它的方法参数。当你的持久化类型泄漏到你的域中时,除了DRY – Tseng
我的搜索请求涉及很多外,该存储库几乎没有用处,我已经定义了帮助类来构建它们。所以你建议我让'repo'返回我的'SearcModel'并让这些帮助者帮助我的'repo'? –