Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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# 体系结构中的服务层-DLL?_C#_.net_Wcf_Dll_Architecture - Fatal编程技术网

C# 体系结构中的服务层-DLL?

C# 体系结构中的服务层-DLL?,c#,.net,wcf,dll,architecture,C#,.net,Wcf,Dll,Architecture,我们正处于.Net中的中/大型应用程序的早期设计阶段,该系统具有三个不同的客户端(站点)内部(一个位于单独的域)连接,以及许多外部服务 我们现在关注的是连接的内部站点,我建议使用一个经典的分层应用程序,包括接口层、服务层、业务逻辑层和数据访问层 在图中,我们有一个连接到MVC应用程序的浏览器。控制器有一个对服务项目的引用(可能每个“业务领域”都有类,例如“PersonService”)。MVC将直接引用此服务项目。在服务层,还将有一些WCF项目,将某些功能公开给外部源、其他内部站点和服务等 不

我们正处于.Net中的中/大型应用程序的早期设计阶段,该系统具有三个不同的客户端(站点)内部(一个位于单独的域)连接,以及许多外部服务

我们现在关注的是连接的内部站点,我建议使用一个经典的分层应用程序,包括接口层、服务层、业务逻辑层和数据访问层

在图中,我们有一个连接到MVC应用程序的浏览器。控制器有一个对服务项目的引用(可能每个“业务领域”都有类,例如“PersonService”)。MVC将直接引用此服务项目。在服务层,还将有一些WCF项目,将某些功能公开给外部源、其他内部站点和服务等

不过,WCF项目将连接到主服务DLL以从中获得共享功能

然后,服务项目直接引用包含所有业务逻辑的业务项目。然后它引用了数据访问项目,该项目有一个/一些实体框架模型作为SQL Server数据库的ORM

SharedLib只是一个所有层都引用的项目,包含任何共享逻辑,但主要用于DTO(数据传输对象)。EF模型在数据层转换为DTO,因为没有其他层参考EF模型

但是MVC应用程序,通过应用程序内的直接引用连接到服务层,并将WCF服务公开给外部源和跨域内部站点

我们遇到的问题是在服务层上。我认为这应该是一个DLL,其他人说,如果没有WCF,那么表示应该直接连接到业务逻辑层。他们会问,‘为什么要在这里增加服务DLL的额外层和复杂性?’

消除表示“可以”直接连接到逻辑的服务层是否是一种良好的做法?我看到了服务层的好处,它增加了业务和表示的清晰分离,并允许扩展。它看起来确实像一个传递dll,但是直接连接到BL似乎很奇怪


使用DLL是否有利于/不利于保留/不保留它?

当我看到图片中对MVVM模式的提示时,我假设是这样,但它不应该对答案产生真正的影响

我没有完美的答案,但我不认为应该直接访问业务层

我认为界面需要的任何功能都应该可以通过视图模型中的命令访问,这些命令使用可用的服务来执行它们的任务

在我看来,业务层应该是业务规则,比如创建发票时的公式和预算映射。另一个生成采购订单号的示例

另一方面,发票服务将负责应用您拥有的不同业务规则,以便生成、修改等(管理)您的发票

当不需要将事情变得太复杂时,我经常看到的是业务层将隐式地包含在服务层中

将服务层编译为DLL的最大优点是,它们可以由应用程序的不同部分(例如前端和后端)共享。例如,如果您使用ASP.net构建前端,那么能够共享服务将是一个优势,但是如果您使用angular.js之类的工具,那么显然它们将不可用,从而使库变得不那么理想

我还看到了WebAPI的一点提示,它是将客户端接口与基于服务器的后端分离的最新趋势。这种模式通常意味着客户机不了解您的业务逻辑或您的后端。发送HTTP请求以执行操作,API根据操作(GET vs POST)以确认或数据进行响应

至于WCF部分,我不太熟悉,我个人使用RabbitMQ

总而言之,我希望我的咆哮能让你有所思考,并帮助你做出决定

由于这是一个C#.net问题,我想我可以放心地假设您的解决方案将在visual studio中创建。就我个人而言,如果有足够的目的将服务与业务逻辑分开,我会毫不犹豫地向我的解决方案中添加一个额外的库项目,并添加对需要它的项目的引用。它不会增加太多开销,因为它的大部分由VisualStudio管理(或者在自动生成时在命令行中使用msbuild)

如前一段所述,我将在我的解决方案中创建库项目,因为管理它并不太复杂&它实际上会促进适当的名称空间管理,这是一个小小的好处


我认为你们不应该害怕拥有更多的dll(同样取决于项目的规模)。如果你仔细想想,每次你在你的项目中添加一个nuget包,你本质上就是在依赖另一个dll。

我不打算在服务交付层上解决任何问题;在服务层的设计中,向浏览器交付服务结果的方式应该是中立的。我们目前使用的是一个完全使用AngularJS的客户端UI,它工作得非常好

对我来说,拥有层主要是为了允许抽象和允许用其他东西替换层,或者修改层的实现方式而不重写所有内容。因此,在我的设计中,各层相互重叠;因此,服务层应该只使用存储库,存储库是引用域模型/核心业务逻辑的唯一位置

在过去的4年里,我一直在一个相当大的系统上工作。我们开始使用Windows Wor