好的,这是给你们的另一个:
我开始进入 n 层应用程序世界。我已经阅读了一些有关该主题的文章,一般建议是 n 层应用程序的目标是抽象层间功能。因此,基于此,在 n 层应用程序中,常规模型为:
数据访问 -> 业务层 -> 表示
由于我是一名 .NET 开发人员,我认为要增强与多种客户端类型(Silverlight、Web 应用程序甚至 WinForms 客户端)的集成,我应该使用 WCF(Windows Communication Foundation)作为业务层的数据服务,因此无论其类型如何,客户端都可以与其通信。另外,我是 NHibernate 作为 ORM 的 super 粉丝。所以我的结构是这样的:
数据访问 (NHibernate) -> 业务层 (WCF) -> 表示(WPF、ASP.NET、WinForms)
好的,这就是设置。我是这种方法的新手,所以我想我可以在这里发帖寻求有关此设置的建议。另外,我对如何在 VS 解决方案中设置它感到很困惑,我喜欢在不同的项目中分离层,但是数据对象(如客户、订单等)的抽象呢?我要把它们放在一个单独的库中吗?那么 WCF 呢?我知道通过网络将数据类传输到客户端是程序员的罪过。专业人士如何实现这一目标?
谢谢,如有任何建议,我们将不胜感激。
最佳答案
这非常符合目标。然而,N-Tier 比 N-Layer 复杂一点,可以通过询问“您的层实际上是在单独的物理服务器上吗?”来对比。
根据您的业务层的复杂程度,您可能希望在业务层和服务层之间进一步抽象它。通常,这两者联系非常紧密,并且位于同一台物理服务器上。服务层通常充当您的 BLL 的门面。
如果您的表示层位于同一台服务器上,那么您的 ASP.NET 或 WinForms 应用程序可能希望在不通过 WCF 服务的情况下与 BLL 进行通信。
继续阅读 Microsoft Patterns & Practices - Application Architecture Guide。
您的域对象应该存在于它们自己的程序集中,通常是您的域模型。根据 Microsoft Framework Design Guidelines 的说法,相应地命名项目程序集是一种很好的做法:
[公司].[产品或组件].[...]
我碰巧喜欢这种命名空间的格式,通常使用:
[公司].[产品].[层].[子层].[...]
这是一个使用解决方案文件夹来组织每个项目的示例解决方案:

在这个例子中,我有一个 BLL 和服务层。服务层在 WCF 库中提供实际实现,而演示文稿实际上包含用于托管服务的 WCF Web 应用程序。将实现与接口(interface)分开总是好的做法。
/Client 文件夹可以忽略,我只是将其用作测试的示例控制台应用程序。任何使用您的服务的客户端应用程序都应该有自己的解决方案,否则您将要管理一个庞大的解决方案。
至于通过网络传输的数据对象...我假设您指的是 ORM 中的类。 (域模型)你是正确的,它通常被认为是不好的做法。解决方案是使用数据传输对象。你可以从图片中看到我有一个.Dto 库。如果您能够使用像 AutoMapper 这样的工具,那么我完全赞成,但是,将 DTO 添加到您的解决方案会带来更多的复杂性和维护。我相信 Dino Esposito 写了一篇关于这个主题的好文章。会尽力为您找到它。
希望这对您有所帮助。
[编辑]
我应该指出,我不熟悉 nHibernate 的功能。使用该 ORM 可能有更好的解决方案。我只使用过 Entity Framework 。
[编辑 2]
查看 Dino Esposito 的 - The Pros and Cons of Data Transfer Objects
关于c# - 给新手关于 N 层应用程序的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4484081/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha