【问题标题】:How to avoid many service methods each one for a different query如何避免多种服务方法,每种方法用于不同的查询
【发布时间】:2014-02-14 18:56:35
【问题描述】:

此站点仅查询数据库 - 无 CRUD

我有一个从 ApiController 调用的服务 DLL,ApiController 方法由我的 HTML 中的 ajax 请求调用。

我的问题是我的服务变得很麻烦。这里只是方法存根的几个示例。我有比这更多的方法。然后它变得更加毛茸茸,因为我必须将每个服务调用都包含在我的 APIController 中。

服务

    public IEnumerable<CodedValue> GetStreetSuffix()
    {
        using (var s = new SqlConnection(this.connection))
        {
            s.Open();
            var results = s.Query<CodedValue>(
                 @"SELECT DISTINCT STR_SFX Value,STR_SFX Code FROM Addresses  ORDER BY 1").ToList();
            return results;

        }            
    }

    public IEnumerable<dynamic> GetStreetNumbers(string term)
    {
        using (var s = new SqlConnection(this.connection))
        {
            s.Open();
            var results = s.Query<dynamic>(
                 @"SELECT DISTINCT STR_NUM FROM Addresses where ISNULL(RTRIM(STR_PFX) + ' ','') + RTRIM(STR) + ISNULL(' ' + STR_SFX,'') = @q", new { q = term }).ToList();
            return results;

        }
    }

API控制器

[HttpGet]
public IEnumerable<dynamic> ListStreetNumbers(string term)
{
    var searchservice = new SearchService();
    var results = searchservice.GetStreetNumbers(term);
    return results;
}

[HttpGet,HttpPost]
public IEnumerable<dynamic> CountParcelsByAddresses(Address json)
{
    var searchservice = new SearchService();
    var results = searchservice.CountParcelsByAddress(json);
    return results;
}     

我能做些什么来使这个更干净,同时又不把它抽象出来。我所做的大部分工作都是试图避免在我的控制器或我的 HTML 中使用 SQL 查询。

【问题讨论】:

    标签: c# asp.net-mvc refactoring service-layer


    【解决方案1】:

    我同意 - 控制器或 HTML 中不应有 SQL。

    我创建了一个单独的基于接口的持久层并将其隔离在实现中。

    【讨论】:

    • 你知道 git 上有哪些项目很好地使用了这种技术吗?我想看看一些更好的做事方式的例子
    • 是的,Java 的 Spring 框架就是这样做的。还有一个 Spring.NET,但我不熟悉它。 Controller 通常与 View 紧密相关,因此最好让与 View 无关的东西远离它。 Spring 会说 (View->Controller)->Service->Persistence。基于接口的服务层可以暴露为 Web 服务。这就是谁拥有满足用例所需的事务以及模型和持久性对象。
    【解决方案2】:

    看看SocialGoal

    该项目使用实体框架,该框架使用存储库模式来保存 dbcontext 对象(数据库映射层)的实例。每个存储库还继承自一个存储库基类,该类为 dbset 对象实现通用方法,例如 Get、GetAll、Create、Delete 方法。如果您更喜欢 SQL 语句,您可以在该层中创建。您的服务层将查询存储库层并获取您想要的域对象。

    【讨论】:

      猜你喜欢
      • 2017-02-11
      • 1970-01-01
      • 2019-09-23
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 2023-03-17
      • 2015-10-27
      • 1970-01-01
      相关资源
      最近更新 更多