Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 服务层是否充当DAL的门面?_C#_Oop_Repository_Service Layer - Fatal编程技术网

C# 服务层是否充当DAL的门面?

C# 服务层是否充当DAL的门面?,c#,oop,repository,service-layer,C#,Oop,Repository,Service Layer,我正在阅读有关服务层和存储库的内容。现在我想知道服务层是否必须包装dal。我经常使用存储库和MVP模式。演示者现在掌握了业务逻辑。但我越想,它不是一个将业务逻辑放在演示者或数据访问层中的逻辑位置。这就是服务层的作用所在 但是演示者现在是否与服务层对话?演示者是否“允许”访问存储库?还是一切都应该通过服务层?在后一种情况下,服务层只是一个中间人: MyFooService: public List<Foo> GetAllFoo() { var listFoo = new FooR

我正在阅读有关服务层和存储库的内容。现在我想知道服务层是否必须包装dal。我经常使用存储库和MVP模式。演示者现在掌握了业务逻辑。但我越想,它不是一个将业务逻辑放在演示者或数据访问层中的逻辑位置。这就是服务层的作用所在

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

MyFooService:

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

   return listFoo;
}
演示者:

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

   return listFoo;
} 

这条路好吗?或者“允许”演示者直接调用存储库吗?

有时,您不需要过度设计内容,也不需要在不需要的时候强制创建模式

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

通常,您的服务层将执行与您的数据不直接相关的操作。想想PaymentService、AnalyticsService等类似的东西,它们可以分离成一个可重用的组件

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

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.
}

有时候,当你不需要的时候,你不需要过度设计事物或者强迫它们成为模式

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

通常,您的服务层将执行与您的数据不直接相关的操作。想想PaymentService、AnalyticsService等类似的东西,它们可以分离成一个可重用的组件

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

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.
}

我想说的是,如果您正在进行大中型开发,最好不要将业务逻辑放在表示层中。如何将其隔离是另一个问题


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

我想说,如果您正在进行大中型开发,最好不要将业务逻辑放在表示层中。如何将其隔离是另一个问题


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

如果我理解正确,演示者可以调用存储库。是的,演示者/控制器可以调用服务和数据层。这是一个稍微复杂的定义,但可能会有所帮助。顺便说一句,更新了我的答案。如果我理解正确,演示者可以调用存储库。是的,演示者/控制器可以调用服务和数据层。这是一个稍微复杂的定义,但可能会有所帮助。更新了我的答案顺便说一句。你还需要清楚什么是业务逻辑,演示者包含什么样的业务逻辑?@gideon它包含一些必须由web服务重用的逻辑不确定我是否理解你,如果你的演示者正在调用/使用web服务,这不是业务逻辑,如果您的演示者/控制器正在执行需要重用的操作,则需要将其放入类中。业务逻辑是指通过接口执行的操作,如Adda,b,addition是业务逻辑,但调用MathService.Adda,b然后将此输出提供给演示文稿不是业务逻辑,它的控制器逻辑。@gideon我的意思是,现在我把业务逻辑放在presenter中,在您的情况下,对象的状态可能会改变
电子控制器。现在我必须创建Web服务,它也需要这种业务逻辑。但是webservice无法访问presenter,所以我需要创建一个服务层,对吗?是的,您将需要重新使用的逻辑封装到类中,这可能是您的服务层,然后在presenter和webservice中相应地使用它。您还需要清楚您所说的业务逻辑是什么,演示者包含什么样的业务逻辑?@gideon它包含一些必须由web服务重用的逻辑不确定我是否理解,如果演示者正在调用/使用web服务,这不是业务逻辑,如果演示者/控制器正在做需要重用的事情,则需要将其放入类中。业务逻辑是指通过接口执行的操作,如Adda,b,addition是业务逻辑,但调用MathService.Adda,b然后将此输出提供给演示文稿不是业务逻辑,它的控制器逻辑。@gideon我的意思是,此时我将业务逻辑放在presenter中的对象可能会从状态更改为控制器。现在我必须创建Web服务,它也需要这种业务逻辑。但是webservice无法访问presenter,所以我需要创建一个服务层,对吗?是的,您将需要重用的逻辑封装到类中,这可能是您的服务层,然后在presenter和webservice中相应地使用它。