Mar*_*ijn 1 c# oop repository service-layer
我正在阅读有关服务层和存储库的信息.现在我想知道服务层是否必须包装dal.我正在使用存储库和MVP模式进行大量工作.演示者现在拥有业务逻辑.但是我想的越多,它就不是将业务逻辑放在演示者和数据访问层中的逻辑场所.所以这就是服务层的用武之地.
但是,演示者现在是否与服务层进行了对话?是否"允许"演示者可以访问存储库?或者一切都应该通过服务层?在后一种情况下,服务层只是一个中间人:
MyFooService:
public List<Foo> GetAllFoo()
{
var listFoo = new FooRepository().GetAll().TiList();
return listFoo;
}
Run Code Online (Sandbox Code Playgroud)
主持人:
public List<Foo> GetAllFoo()
{
var listFoo = new MyFooService().GetAllFoo();
return listFoo;
}
Run Code Online (Sandbox Code Playgroud)
是好的方法吗?或者"允许"演示者直接调用存储库?
有时,当您不需要时,您不需要过度设计或强制进入模式.
DAL本身就是一种访问数据的特殊服务.
通常,您的服务层将执行与您的数据无直接关系的内容.想想像PaymentService,AnalyticsService等类似的事情,可以将它们分成可重复使用的组件.
让我们说你需要在所有社交媒体上分享一篇文章,你可以把它放到一个服务中,该服务可以签署正确的社交媒体并发布:
MySocialBlastService : ISocialService
{
void ShareToTwitter() { }
void ShareToFacebook(){ }
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以通过控制器/演示者调用此服务.
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);
}
Run Code Online (Sandbox Code Playgroud)
这样你就清楚了解业务逻辑是什么:
MathService
{
int Add(a,b) { ..} //this is business logic
}
Run Code Online (Sandbox Code Playgroud)
它需要做的一些事情,你可以在不触及界面的情况下完成它,这需要封装.更真实的例子是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.
}
Run Code Online (Sandbox Code Playgroud)