草庐IT

c# - 关于构建领域驱动设计命名空间的一些问题

coder 2024-06-02 原文

我有一些关于框架设计的一般性问题。

我正在使用 C#.NET(框架 3.5)和 SQL 2008(使用 LINQ)为 iPhone 应用程序构建 API。我遵循了领域驱动设计模式(在一本书中)并且 具有以下文件夹结构:

Core
- DataAccess
--Impl
-Domain
-Impl

Core 是我的核心 API 库 - 我的 DLL。 DataAccess 包含数据访问接口(interface) DataAccess.Impl 包含存储库(LINQ to the DB) 域包含我的大部分数据类型和属性。 Impl 包含我的服务(即 AccountService.cs、EmailService.cs)

现在,作为练习,我向这个项目添加了一个 Windows 服务 并试图从该服务中的 DLL 调用功能。 我的问题是,我应该向其他应用程序公开哪一层 什么应该隐藏?

  • Impl 文件夹中的服务类应该是程序员看到的吗?
  • 或者来自 DataAccess.Impl 的存储库?
  • 或者,我是否应该将所有内容都展示给程序员看?看起来 现在,这似乎有点令人困惑。

当我开始阅读有关 DDD 的内容时,我假设存储库是 被服务类隐藏和访问,但我发现我需要调用 来 self 客户的功能。我设计错了吗?

我的另一个问题与 namespace 命名有关。当 Windows 服务 从我的核心库调用功能,我必须这样做:

using Company.Product.ProductCore.Core.DataAccess.Impl 
using Company.Product.ProductCore.Core.Domain 
using Company.Product.ProductCore.Core.Impl

这看起来很啰嗦。查看 Microsoft 的 DLL,它们似乎保持两层 惯例 -(System.Linq、System.Text 等)。拥有 Company.Product.ProductCore.Core.Impl 看起来很乱,并没有真正告诉程序员这个命名空间的作用(但它 是我阅读的示例所建议的)。这里有最佳实践吗?

非常感谢您的建议(和任何示例)。

谢谢。

最佳答案

域绝对不是您要找的,在我看来,您的数据访问层也不是。

以我的拙见,如果我们考虑 Façade 设计模式,它会公开您的库子系统的特性和功能,那么必须公开的内容还不存在,也就是说,静态类。

Façade 设计模式解释:

  1. Façade Design-Pattern - (Gang of Four) ;
  2. Facade pattern (Wikipedia) .

那么最后,您的代码应该做什么?只公开您应该知道的必要内容,因为您是唯一知道您正在开发的系统的人。

简而言之,我经常使用 Façade 模式,这样我就可以将我的类、实现和几个相关的子系统隔离在一个 façade 的幕后。假设我们是一家全新的汽车经销商。这个立面将是巨大的 window ,让您可以看到陈列室中暴露的汽车。你必须想想这个立面暴露了什么。它只暴露汽车吗?

在我看来,这个立面暴露了汽车,你可以买,借钱买,修车,买其他相关配件等等。需要。与汽车等其他元素相同。也就是说,您可能只想公开一个接口(interface),并为自己保留实现,以便通过您的外观,当您必须返回一个 ICar 或一个 IAccessory 时,你必须通过你的实现对象类来实例化它们,然后通过你的外观返回接口(interface)实例。也就是说,用户不需要知道引擎盖下发生了什么,只是如果他想要一辆车,他必须通过您的外观订购。就像您不会去梅赛德斯奔驰购买马自达 3 一样。您将使用正确的外观。话又说回来,不同的汽车经销商可能只是子系统,因此是某种工厂。然后,您向 façade 询问具有这种和那种规范的汽车,而 façade 应该知道要返回哪个 ICar 实例以交换您要求它为您提供的东西。

希望这对您有所帮助! =)

关于c# - 关于构建领域驱动设计命名空间的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4355210/

有关c# - 关于构建领域驱动设计命名空间的一些问题的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  4. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  5. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  6. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  7. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  8. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  9. ruby - 在 Ruby 中构建长字符串的简洁方法 - 2

    在编写Ruby(客户端脚本)时,我看到了三种构建更长字符串的方法,包括行尾,所有这些对我来说“闻起来”有点难看。有没有更干净、更好的方法?变量递增。ifrender_quote?quote="NowthatthereistheTec-9,acrappyspraygunfromSouthMiami."quote+="ThisgunisadvertisedasthemostpopularguninAmericancrime.Doyoubelievethatshit?"quote+="Itactuallysaysthatinthelittlebookthatcomeswithit:themo

  10. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

随机推荐