4

我在循环引用/依赖方面遇到了几个问题,我整天都坐在那儿。我的思维过程一定有问题,我只是不明白。

这是我的项目:

Flip.Main     (ASP.NET MVC)
Flip.Domain   (C# DLL)
Flip.Services (C# DLL)
Flip.Utility  (C# DLL)

当前参考/依赖:

Flip.Main ->     Flip.Domain, Flip.Services, Flip.Utility
Flip.Services -> Flip.Domain, Flip.Utility
Flip.Domain ->   Flip.Utility

我想以我的服务项目具有所有服务的方式来构建我的项目,我的域项目是模型、存储库和用于查询模型的“流利”扩展,并且主要和实用程序项目几乎是不言自明的。

遇到的问题:

1) 我的 Flip.Services 项目中有一个 EmailService,它需要发送本地化的电子邮件。所有本地化都在 Flip.Main 的 App_GlobalResources 中完成。现在不知道如何将强类型电子邮件和其他本地化资源获取到我的服务层,因为 Flip.Main 已经依赖于服务层,因此我可以让它依赖回主项目。

2) 我有业务类,例如代表强类型搜索查询的 CustomerSearchFilter。我想要 Flip.Domain 项目之外的那些业务类,因为它们不是域模型的一部分。但是,在我的 CustomerSearchFilter 类中,我有域类实例(例如 CustomerGroup),因此它需要了解域类。同时我的 Flip.Domain 项目中的 Fluent 接口需要知道 CustomerSearchFilter 是什么,以便我可以将它应用到我的 IQueryable 接口。再次循环引用。

3) 我有一个自定义的 [AuthorizeSessionState] 属性,我用它来装饰我的 ASP.NET MVC Flip.Main 项目中的特定控制器操作。这是一个 ActionFilterAttribute,它需要实例化位于我的 Flip.Services 项目中的我的 SessionService。我不能把它放到我的 Utility 类中(因为 Flip.Services 已经引用了 Flip.Utility)。我认为他们也不应该在 Flip.Main 中——我是否必须为此制作另一个项目!?

(还有 20 个)

我觉得我在某个地方犯了错误,尤其是当我读到其他人通常不会遇到循环引用问题时。帮助?

4

6 回答 6

5

对所有重要的类使用接口。将接口放在与实现不同的程序集中。

于 2009-08-24T05:33:25.167 回答
0

问题归结为您按名称空间分隔什么以及您按 DLL 分隔什么。如果您有充分的理由保持一切模块化,那么您必须非常努力地工作。但是,如果这些 dll 中的每一个都只有一两个类,也许您可​​以将它们合并在一起?

于 2009-08-24T05:11:46.020 回答
0

花几分钟整理一下程序……为每个项目(FM、FS、FD、FU)创建一个标识符。在页面上列出每个可公开访问的过程,然后为项目添加标识符,如果该项目使用该过程...

然后您可以看到哪个程序需要在(或可访问)哪个项目中。

希望有帮助!

于 2009-08-24T05:19:44.007 回答
0
  1. 您可以将本地化的电子邮件字符串放入 Flip.Services。缺点是您有两个地方可以维护本地化资源。您还可以为所有资源使用单独的 dll,以最大限度地减少编辑资源的位置。
  2. 您必须将流利的界面移动到其他 dll 或使 CustomerSearchFilter 成为域的一部分。
  3. 您将需要添加更多项目或重新排列您的结构并使用命名空间来创建分隔。
于 2009-08-24T05:45:57.607 回答
0

这听起来像是您建立在具体实现而不是接口/合同上。正如 Ima 建议的那样,定义描述某个类应该能够做什么的接口。声明属性、参数等时使用此接口。将接口与实现分开,实现和使用接口的项目都可以引用接口项目。

然后,您可以获得使用依赖注入的不错选择,从而使您的代码更容易作为一个方面进行测试

于 2009-08-24T05:46:10.430 回答
0

在域的“层”中,存储库和服务位于相同的逻辑级别,在基础架构角色的域之上。我建议将您的存储库实现(查询等)移到域本身之外。这至少解决了#2。

于 2009-08-24T06:03:49.613 回答