1

这可能根本不可能,但我想在我们放弃这个想法之前我会得到你的回应。

我们在一个解决方案中有 3 个主要项目:接口、逻辑和数据访问。数据访问项目包含所有对象类及其变量和方法。Logic Project 包含包含逻辑方法的类和 2 个处理来自数据访问项目的对象的保存和加载的类。Interface 项目是用户界面,任何需要在此处/不需要在逻辑层中的类和方法。

我们打算保持清晰的分离并保持接口->逻辑->数据访问的通信并以相同的方式返回。这一切都很好,但不幸的是,要让接口理解数据访问类对象及其值被传回,我们显然需要在接口项目中添加对数据访问项目的引用。

希望我还没有失去任何人?

现在显然我们可以允许接口从数据访问项目中读取值,但我们不希望接口项目调用任何方法,因为这些都是通过逻辑层以特定方式处理的。我知道这只是一个设计时问题,但无论如何我们可以将方法设置为不可从某些项目调用?我们不想捕获在运行时调用该方法的项目,因为这为时已晚。

这听起来像是一个矫枉过正的问题,但由于我和我的同事可能不是唯一在将其发布给公司后从事此工作的开发人员,我们希望任何其他开发人员都遵循解决方案和项目的严格准则和结构。我们可以把它全部写下来,并尝试确保他们在开发应用程序之前阅读它,但我们都知道,如果您被紧急要求从事某项工作,则无法保证您有时间阅读其他开发人员技术关于应用程序的规范。

如果您需要更多信息来提出任何解决方案,请询问。

非常感谢大家,

路易斯·拉塞尔

4

6 回答 6

2

出现您的问题是因为您允许顶层(用户界面)从底层(数据访问)引用类型。不要这样做。

相反,定义一些您的用户界面应该针对其编程的抽象(接口或基类)。您可以将这些抽象放在逻辑层或新库中。

然后,您的数据访问库应该实现这些抽象。

您可以使用依赖注入 (DI) 在运行时将真实的数据访问库注入到用户界面中,而实际上这两者之间没有任何硬引用。

这可以手动完成,也可以使用诸如 Castle Windsor 之类的 DI 容器来连接依赖项。

于 2009-09-29T09:04:19.413 回答
2

您可以使用InternalVisibleTo属性,并标记您要限制访问的方法internal

注意:在您的情况下,我不会使用它。我宁愿重新考虑设计。您的域对象位于“数据访问项目”中似乎有点奇怪。为什么没有 UI 项目、逻辑项目、数据访问项目和模型项目?

于 2009-09-29T08:56:23.760 回答
1

您可以将数据存储类(即您传递的类)抽象为一个单独的项目,数据访问和接口项目都引用该项目。然后,您可以从接口项目中删除数据访问项目引用。

于 2009-09-29T09:00:22.823 回答
0

您应该检查Managed Extensibility Framework以进行依赖注入......

于 2009-09-29T08:56:19.307 回答
0

我通常不建议这样做,但您始终可以添加一个调试时间检查,查看 StackTrace 以查看父级对象是什么。基本上,您将沿着跟踪向上走,直到遇到上面的级别(通过检查相关类型的程序集) - 如果您没有遇到它(即您到达顶级程序集),那么您将抛出异常.

仅是 Debug 的原因是,您不想让发布应用程序负担有效的冗余代码。

于 2009-09-29T08:56:22.123 回答
0

也许将这些接口放在逻辑项目中会更好?如果你看一些像领域驱动设计这样的思想流派,数据访问的接口(在 DDD 案例存储库接口中)实际上是领域(也称为逻辑)关注点(而不是数据层)的一部分,因此通常最终会出现在一个不同的项目。

于 2009-09-29T08:56:46.043 回答