C# 客户端到WCF服务的应用程序体系结构

C# 客户端到WCF服务的应用程序体系结构,c#,wcf,architecture,n-tier-architecture,C#,Wcf,Architecture,N Tier Architecture,我很好奇如何正确地构建一个包含以下内容(需要重构)的应用程序: Excel插件 COM可视客户端库,包括WinForms和Excel公开的方法(计算调用和表单激活方法) 然后使用客户端库中的功能连接到WCF服务。 WCF服务目前包含计算逻辑、验证逻辑、通过ORM工具访问数据库 i、 e.加载项->客户端DLL中的Winform/直接调用->WCF->数据库或计算 目前只有2个项目存在这种情况。我的第一个想法是重新设计如下: 客户端项目 Excel“视图”(Project.Client.Exce

我很好奇如何正确地构建一个包含以下内容(需要重构)的应用程序:

Excel插件 COM可视客户端库,包括WinForms和Excel公开的方法(计算调用和表单激活方法) 然后使用客户端库中的功能连接到WCF服务。 WCF服务目前包含计算逻辑、验证逻辑、通过ORM工具访问数据库

i、 e.加载项->客户端DLL中的Winform/直接调用->WCF->数据库或计算

目前只有2个项目存在这种情况。我的第一个想法是重新设计如下:

客户端项目

  • Excel“视图”(Project.Client.Excel),这将COM可见性级别限制为一个项目
  • WinForm“视图”(Project.Client.UI)
  • 两组“视图”(Project.Client.Presenter)的演示文稿
服务器端项目

  • WCF“视图”,包括数据传输对象?(Project.Server.WCF或服务)
  • 服务器端演示者(Project.Server.presenter)
  • 业务逻辑(Project.Business)
  • 数据访问层(Project.DAL)
我的问题是:

  • DTO应该位于WCF项目中还是作为其自己的库/项目
  • 实体转换例程属于哪里(数据实体业务实体DTO)?全部在业务逻辑层中,还是有些在那里,有些在服务器演示器中
  • 对于这种类型的方案,正确的体系结构应该是什么
  • 还有很多我可能错过的
  • 重构的部分思想是纠正架构、分离关注点等,并允许将单元测试包含到设计中

    DTO应该位于WCF项目中还是作为其自己的库/项目

    您不希望它们出现在WCF项目中,因为这意味着客户端必须引用该服务器端项目。最好将DTO、WCF服务契约(接口)等保存在一个单独的“公共”项目中,服务器和客户端项目都可以引用

    实体转换例程属于哪里

    数据访问层中的数据实体业务实体;业务逻辑中的业务实体DTO。当然,跨所有层使用数据实体也是完全可以接受的,这样就不需要所有这些不同的实体,也不需要不断更新映射代码。我想这取决于系统的复杂性,但请看一下EF4 POCO


    至于你的其他问题,在不了解更多关于你的需求和设计的信息的情况下,你的项目列表看起来是正确的。

    这就是我的结构,但这个问题没有100%的正确答案。很多变化都是有意义的,直到它们让你的工作变得舒适为止

    • Excel“视图”(Project.Client.Excel),这将COM可见性级别限制为一个项目
    • WinForm“视图”(Project.Client.UI)
    • 两组“视图”的演示文稿(Project.Presenter)
    • WCF主机(Project.Service)-如果您在IIS中托管,则包含*.svc文件的网站(此处没有合同)。这里没有太多的业务代码,它只用于托管在BLL中实现的方法
    • 业务逻辑(Project.Business)
    • 数据访问层(Project.DAL)
    • 合同(Project.Contract)-操作和数据合同。这是WCF客户端、服务器和BLL都使用的库
    • 共享(Project.Shared)-用于更好地构建依赖关系的公共帮助程序
    DTO应该在WCF项目中还是作为自己的DTO 图书馆/项目

    合同

    实体转换例程属于哪里(数据实体) 企业实体(DTO)?全部在业务逻辑层中,还是有些在那里,有些在服务器演示器中

    中小型项目的业务

    对于这种类型的方案,正确的体系结构应该是什么

    你看起来很好


    服务器端演示者(Project.Server.presenter)-这对我来说毫无意义,因为没有使用它的GUI

    请为演示者在解决方案中执行的每个项目(类库、WPF等)和角色添加类型。由于用户的工作方式,目前所有内容都以DLL结尾,因为Excel加载项是真正的前端。使用WinForms是因为它们比将所有内容都塞进用户表单更丰富、功能更强大。其目的是使所有内容都保持为DLL类库,但在体系结构上更好地在项目之间分割。作为工作的一部分,我想分离WinForms的代码以使用MVP,这样就可以添加单元测试。因此,我设想演示者既为表单MVP工作,又有效地作为Excel库的传递调用。即。DataService.GetTimeSeriesByID(…)传递给.TimeSeries.GetById(…),以便对表单(view/update/etc)和excel函数调用使用公共代码。Excel库将只是包装DTO以进行COM访问。这是否更清楚?我将使用MVP和WinForms来实现这一点,因为当您希望安装ASP.NET前端时(而不是Silverlight,它是一个非初学者),WPF和MVVM也不起作用(在我的阅读中),这可能是某个阶段对某些部分的要求。如果您建议在单独的通用项目中使用服务合同,这是否会违反企业设计的某些原则,即客户应该使用从服务生成的代理,该代理将包括相关的数据合同?在阅读了一些关于分离关注点的材料后,我认为转换器的位置现在对我来说更清楚了,即业务层是否应该知道数据访问层(下面的层)但反过来说,业务层自然需要进行所有转换