2009-09-29 59 views
1

这可能不是所有可能的,但我想我会在放弃这个想法之前得到你的回应。C#类的方法只能从某些项目调用吗?

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

我们打算保持清醒的分离,并保持接口的通信 - >逻辑 - >数据访问和备份相同的方式。这一切都很好,但不幸的是,对于Interface来理解数据访问类对象通过它的值传递回来,我们显然需要在接口项目中添加对数据访问项目的引用。

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

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

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

如果您需要了解更多信息拿出任何解决方案,请询问路程。

非常感谢所有,

路易·罗素

回答

0

我通常不会推荐这一点,但你总是可以添加一个调试时间检查看着StackTrace以查看父级别对象是什么。基本上,你会走上去,直到你遇到上面的级别(通过检查相关类型的程序集) - 如果你没有遇到它(即你到达顶级程序集),那么你会抛出一个异常。

原因仅此是调试,是你不想与什么是有效的冗余代码负担你的发布应用程序。

1

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

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

0

也许最好把这些接口放在逻辑项目中?如果你看看像领域驱动设计这样的一些思想流派,数据访问的接口(在DDD案例库接口中)实际上是域(或称逻辑)关注的一部分(而不是数据层),并且经常以一个不同的项目。

1

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

1

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

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

您的数据访问库应该执行那些抽象。

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

这可以手动完成,也可以通过使用DI容器(如Castle Windsor)来连接依赖关系。