Questions tagged «n-tier»


2
对Web应用程序使用单独的API和UI服务器的好处
在工作中,我们已经开发了将近两年的大型内部应用程序;我最近才刚加入该项目,有些架构使我有些困惑,所以我希望这里的人可以在我问建筑师这些同样的问题之前提供一些建议(这样我可以与他们进行有见地的讨论)。 如果下面的内容过长,我深表歉意,我只想在问我的问题之前,先对系统的外观有一个很好的了解:) 设置系统的方式是,我们有一个主要的Web应用程序(asp.net,AngularJS),该应用程序主要只是聚合来自其他各种服务的数据。因此,基本上,它是AngularJS应用程序的宿主。实际上,有一个MVC控制器引导客户端,然后每个其他控制器都是WebAPI控制器。 这些控制器处理来自客户端的调用,这些控制器始终部署到仅托管Web应用程序的主机上。我们目前有4个这样的盒子。 但是,这些调用最终会路由到另一组WebAPI应用程序(通常是每个业务领域,例如安全性,客户数据,产品数据等)。所有这些WebAPI也会一起部署到专用盒中。我们也有四个这样的盒子。 除了一个例外,我们组织的任何其他部门均未使用这些WebAPI。 最后,这些WebAPI对“后端”服务进行了另一组调用,这些服务通常是遗留在各种ERP系统和数据存储(我们无法控制)之上的传统asmx或wcf服务。 我们应用程序的大多数业务逻辑都在这些WebApi中,例如转换旧数据,对其进行汇总,执行业务规则以及通常的事情类型。 我感到困惑的是,在WebApplication和为其提供服务的WebAPI之间进行这样的分离可能带来什么好处。由于没有其他人在使用它们,因此我看不到任何可伸缩性的好处(即,再放入4个API盒来处理增加的负载是没有意义的,因为API服务器上的负载增加必然意味着Web服务器上的负载增加-因此,Web服务器与Api服务器的比例必须为1:1) 我也看不到必须进行额外的HTTP调用的任何好处浏览器=> HTTP => WebApp => HTTP => WebAPI => HTTP =>后端服务。(我的问题是WebApp和WebAPI之间的HTTP调用) 因此,我目前正在寻求将当前的WebAPI从单独的解决方案迁移到WebApplication解决方案中的单独项目,并在它们之间使用简单的项目引用,并使用一个部署模型。因此,它们最终将成为类库。 在部署方面,这意味着我们将有8个“全栈” Web框,而不是4 + 4。 我看到的新方法的好处是 性能提高,因为Web应用程序和WebAPI服务器之间的序列化/反序列化周期减少了 在Web应用程序和WebApi服务器的传出和传入边界上,根据DTO和映射器可以删除(即无需维护/测试)的大量代码。 具有更好的能力来创建有意义的自动集成测试,因为我可以简单地模拟后端服务并避免中间层HTTP跳转带来的混乱。 所以问题是:我错了吗?我是否错过了将WebApplication和WebAPI框分开的一些基本“魔术”? 我研究了一些N-Tier架构材料,但似乎找不到任何可以为我们的情况带来具体好处的东西(因为据我所知,可伸缩性不是问题,这是一个内部应用程序,因此WebAPI应用程序的安全性不是问题。) 而且,如果我将系统重组为建议的设置,那么在收益方面我将损失什么?

6
调试代码的方法(噩梦情况)
我经常在工作中负责调试应用程序。它是一个我们部署到企业的BI应用程序,其中包括测试环境和生产环境。我想知道,基于这些限制,人们是否可以建议任何应用程序/工具/方法: 调试器不能在客户端站点上或本地使用,因为该软件依赖于我们没有测试环境的自定义第三方应用程序。(编辑:说实话,在某些情况下,可以在本地进行调试。如果我们只使用核心代码,那么大多数有问题的代码都位于一个DLL中,该DLL封装了第三方特定的通信:套接字,进程管道,soap调用,更改核心代码行为的自定义逻辑。通常,在为客户实施或增强功能时,我们会在此区域编写新代码。) 实际上,我们的应用程序中没有任何日志记录。没有单元测试。 版本控制只有完整解决方案的1个版本(使用Source Safe 2005)。因此,不可能仅通过单个文件来获得整个解决方案的先前版本。(除非有人知道解决此问题的方法)。 无法本地复制,通常无法在测试环境上复制(测试和生产版本不同的可能性很高)。 客户端使用的版本与来源安全版本不同的可能性很大。这是因为已更新单个文件,这些文件具有针对该特定客户端的嵌入式自定义逻辑。通常会发生的事情是对二进制文件进行更新,这需要更改其他几个二进制文件,但是提交完成后,没有人对此有任何记录或知识。我看到的一个常见错误是客户端环境上的“找不到函数/方法”或“方法调用指定的参数太多/太少”。 这是一个.net VB解决方案 无法在客户端站点上安装任何软件,但可以在本地 我们的应用程序具有极高的可定制性,但是不幸的是,定制逻辑分布在所有类和文件中,从前端一直到数据层,包括基于每个客户端对数据库进行的定制更改。 代码中几乎没有注释。没有有关体系结构的文档。没有有关api的文档。我们唯一拥有的是成百上千的电子邮件链,这些链在某种程度上解释了正在发生的事情。唯一知道该代码的人是最初编写该代码的人,但是他们不再是每个人所说的开发人员,因此他们不会参与其中。 在你说出来之前……是的,我知道;我也想开枪 意大利面条代码,数百个编译器警告以及确实应该修复的破碎多态性并没有帮助,但是我没有发言权。 我遇到的最常见的错误类型是空引用错误,无效的强制转换和缺少的功能/功能签名不匹配。有时我很幸运,事件查看器将记录类,方法和异常消息。它不是最有用的,但还是有帮助。最糟糕的是没有屏幕快照,没有复制步骤的错误,而且是类似于上面提到的一般错误消息。有时,不可能找出它们发生的原因,只能祈祷环境配置不正确,以后环境会消失。 我知道这有点像咆哮,在某种程度上是这样。但是我渴望选择。我还能使用其他方法/工具吗?
16 .net  vb.net  n-tier 

2
n层实体框架解决方案的依赖注入
我当前正在设计一个使用实体框架5(.net 4)作为其数据访问策略的n层解决方案,但是我担心如何合并依赖项注入以使其可测试/灵活。 我当前的解决方案布局如下(我的解决方案称为Alcatraz): Alcatraz.WebUI:一个asp.net Webform项目(前端用户界面)引用项目Alcatraz.Business和Alcatraz.Data.Models。 Alcatraz.Business:一个类库项目,包含业务逻辑,引用项目Alcatraz.Data.Access,Alcatraz.Data.Models Alcatraz.Data.Access:一个类库项目,包含AlcatrazModel.edmx和AlcatrazEntitiesDbContext,引用项目Alcatraz.Data.Models。 Alcatraz.Data.Models:一个类库项目,包含Alcatraz模型的POCO,无引用。 我对这个解决方案如何工作的愿景是,Web-ui将实例化业务库中的存储库,该存储库将具有(通过构造函数)连接字符串(而不是AlcatrazEntities实例)的依赖项。Web用户界面会知道数据库连接字符串,但不知道它是一个实体框架连接字符串。 在业务项目中: public class InmateRepository : IInmateRepository { private string _connectionString; public InmateRepository(string connectionString) { if (connectionString == null) { throw new ArgumentNullException("connectionString"); } EntityConnectionStringBuilder connectionBuilder = new EntityConnectionStringBuilder(); connectionBuilder.Metadata = "res://*/AlcatrazModel.csdl|res://*/AlcatrazModel.ssdl|res://*/AlcatrazModel.msl"; connectionBuilder.Provider = "System.Data.SqlClient"; connectionBuilder.ProviderConnectionString = connectionString; _connectionString = connectionBuilder.ToString(); } …

1
洋葱架构与3层架构
我看到洋葱架构仅比BL负责在DAL(或DAL的接口)上调用方法进行CRUD的3层架构有所益处。洋葱具有更好的关注点分离,可测试性,可维护性,并且更清洁。 那么,洋葱架构在各个方面是否确实更好,并且3层架构只是做事的一种旧方法,或者在某些情况下,我更喜欢使用3层架构,如果这样-哪个?

2
.NET MVC项目体系结构/分层
在为中型MVC Web应用程序规划体系结构时,如何实现这些层尽可能地分离和易于测试?(基本上遵循最佳实践)假设我首先使用代码作为数据访问权限。 我为定义“业务逻辑”的定义以及与数据层交互的方式感到困惑。以车辆销售应用程序为例,业务逻辑是否是执行诸如计算给定车辆的税阶,比较每加仑英里数统计信息之类的任务的类?至于业务实体(例如汽车,货车,摩托车),我会将它们与DataContext班级一起放在数据层中。 还有什么会构成与业务相对的应用程序逻辑-我正在猜测会话/用户输入验证之类的东西? 因此,例如,汽车管理员可能会返回一个操作/查看结果,其中列出了按类型和最佳mpg过滤的前十名汽车。假设我有一个ICarRepository“ carRepo”注入到我的控制器中(使用存储库模式/ DI),我从一个动作方法参数中过滤了我的汽车var cars = carRepo.getCarsByType("hatchback"); 因此,我已使用存储库将数据访问知识排除在控制器之外,现在使用域模型将业务逻辑排除在控制器之外-var result = new MpgCalculator(cars); -假设我需要计算器类,因为它需要执行其他逻辑以计算最佳燃油效率,而不仅仅是从数据库中加载/过滤实体。因此,现在我有了一个供呈现的视图数据集,该数据集使用存储库从数据访问层检索,并且使用特定于域的对象来处理和执行与数据相关的业务相关任务。 我在这里犯错吗?我们仍然需要使用存储库模式吗?或者我可以只对接口进行编码以解耦ORM和进行测试吗?关于这个主题,因为我的具体数据访问类dbcontext在数据层中,所以接口定义是否应该进入域/业务层,这意味着如果数据访问技术发生了变化,我的其他层是否会受到影响? 根据到目前为止的研究,我的结构如下所示: MVC Internet应用程序 ->标准Internet项目-这里的模型是ViewModels 域/业务层 ->特定于业务的类/模型,控制器可以使用这些类/模型来处理数据层中的域实体,然后再传递到相关视图 存储库抽象有必要吗?->我听到很多关于此的辩论,尤其是在使用ORM时 数据层 ->实体类(汽车,货车,摩托车),DbContext-具体数据访问技术层

2
存储库模式与DAL对象创建
据我了解,IRepository应当包含CRUD。然后,我们继承了这个IRepository在我们的其它接口,如IProduct和落实IProduct具体类ProductRepository,用类似的方法GetAllProducts(),Top5Products()。 我们也可以对n层架构进行同样的操作。像,创建DAL Class Library并在它定义一个类Product以类似的方法GetAllProducts(),Top5Products()。 在这两个DAL.Product和Repo.ProductRepository我们初始化类DB Context的Entity Framework和查询我们的相关数据。 呼叫是在两个相似Repo.ProductRepository或DAL.Product从方法BLL 鉴于这些相似之处,我的问题是Repos有什么好处?我可以使用的多层架构与做同样的轻松得多(Controller,BLL Class Library,DAL Class Library)。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.