【问题标题】:Does a service layer act as a facade for the DAL?服务层是否充当 DAL 的外观?
【发布时间】:2012-02-26 05:18:22
【问题描述】:

我正在阅读有关服务层和存储库的信息。现在我想知道服务层是否必须包装 dal。我经常使用存储库和 MVP 模式。演示者现在拥有业务逻辑。但越想越不是把业务逻辑放在presenter中,也不是放在数据访问层的逻辑地方。所以这就是服务层进来的地方。

但是演示者现在是否与服务层对话?演示者是否“允许”访问存储库?或者一切都应该通过服务层?在后一种情况下,服务层只是一个中间人:

我的FooService:

public List<Foo> GetAllFoo()
{
   var listFoo = new FooRepository().GetAll().TiList();

   return listFoo;
}

演讲者:

public List<Foo> GetAllFoo()
{
   var listFoo = new MyFooService().GetAllFoo();

   return listFoo;
} 

是好方法吗?还是“允许”演示者直接调用存储库?

【问题讨论】:

  • 你也需要清楚你所说的业务逻辑是什么意思,presenter包含什么样的业务逻辑?
  • @gideon 它包含一些webservices必须重用的逻辑
  • 不确定我是否理解您,如果您的演示者正在 调用/使用 Web 服务,这不是业务逻辑,如果您的演示者/控制器正在执行需要 被重用然后这需要放入一个类。业务逻辑是你通过接口做的事情,比如Add(a,b),加法是业务逻辑,但是调用MathService.Add(a,b) 然后将此输出提供给演示文稿不是业务逻辑,而是它的控制器逻辑。
  • @gideon 我的意思是,此时我将业务逻辑(可能是从状态更改的对象)放入演示者(在您的情况下为控制器)。现在我要创建webservices,它也需要这个业务逻辑。但是webservice不能访问presenter,所以我需要创建一个service层,对吧?
  • 是的,您将需要重用的逻辑封装到类中,这可能是您的服务层,然后在您的演示者和 Web 服务中相应地使用它。

标签: c# oop repository service-layer


【解决方案1】:

有时,您不需要过度设计事物或在不需要时强加模式。

DAL 本身就是一种访问数据的特殊服务。

通常,您的服务层将执行与您的数据不直接相关的事情。想想像 PaymentServiceAnalyticsService 之类的东西,它们可以分离成一个可重用的组件。

假设您需要在所有社交媒体上分享帖子,您可以将其放入一个服务中,该服务负责登录正确的社交媒体并发布:

MySocialBlastService : ISocialService 
{
  void ShareToTwitter() {  }
  void ShareToFacebook(){ }
}

现在您可以从您的控制器/演示者调用此服务。

public ActionResult ShareLink(string link..) //asp.net-mvc method as an example
{// maybe you could use dependency injection here to get ISocialService
  ISocialService _service;
  _service.ShareToTwitter(link);
}

只是为了让您清楚什么是业务逻辑:

MathService
{
 int Add(a,b) { ..} //this is business logic
}

这是你需要做的一些事情,你可以在不接触接口的情况下完成,这需要封装。更多真实世界的例子是SecurityService.ResetPassword()

当你从控制器调用它时:

您可以在Web 应用程序或Windows 应用程序中使用添加 的业务逻辑,并通过某个接口从用户那里获取输入。 如何这是控制器逻辑。

public ActionResult Calculate(int a, int b)//comes from webpage
{
 //this is controller logic
 int ret = MathService.Add(a,b);
 //logic to send ret back 
 //to some other page to display to user.
}

【讨论】:

  • 如果我理解正确,演示者可以调用存储库..
  • 是的,演示者/控制器可以调用服务和数据层。这是 IMO 的一个稍微复杂的定义,但它可能会有所帮助(martinfowler.com/eaaCatalog/serviceLayer.html)。顺便更新了我的答案。
【解决方案2】:

我会说,如果您正在进行“严肃”的中到大规模开发,最好不要将业务逻辑放入您的表示层。你如何隔离它是另一个问题。

另一方面,如果您使用 Entity Framework 或 NHibernate 之类的东西,我只会在确实需要抽象数据访问时创建存储库,例如在测试时使用模拟。

【讨论】:

    猜你喜欢
    • 2014-08-05
    • 2013-02-08
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多