防止一个项目在 .NET 中引用另一个项目

Preventing one project from referencing another in .NET

我有一个 ASP.NET 站点,该站点使用来自单个 class 库项目 (RootServices) 的服务该库调用 2 个(或更多)子服务 class 库项目(例如 PeopleService & OrderingService )这些服务项目与 entity framework 项目(例如 PeopleDBEntities & OrdersDBEntities)一对一映射到相应的数据库。

好的,这很好,因为我们对每个部分都有单一的责任,并且我们得到了 微服务 的好处,而没有通过网络进行调用的可怕浪费(以纳秒为单位的延迟不是毫秒!)

然而,当我们向团队中添加新人时,他们希望从 PeopleService 调用 OrdersDBEntities 并从 RootServices 调用 PersonEntities 没有循环依赖,但是仍然不是我设计的。 **啊,我美丽的建筑正在变成一堆意大利面条! **

是否有一种简单的方法可以强制指定的项目只能被其他特定项目引用?

我建议添加项目文件的单元测试以确保引用不存在。根据程序集名称的区别性,这可能就像检查文件是否包含该名称一样简单,或者您可能需要一个正则表达式。

可以适当地命名测试,这样如果它失败了,开发人员就可以得到适当的启发,甚至不需要问问题是什么。

我假设您已经进行了单元测试,这些单元测试通常是 运行(例如,作为自动构建的一部分),这样通过破坏测试就可以解决问题将由损坏的构建突出显示。

唯一的答案,即公认的答案,说“是的,有办法”,但没有解释如何。方法如下:

Assembly.GetExecutingAssembly()
        .GetReferencedAssemblies()
        .Select( a => a.Name )

以上代码片段将获取当前正在执行的程序集引用的所有程序集的名称。然后,您可以检查此名称列表是否包含不应引用的程序集的名称。

有关详细信息(以及更完整的代码),请参阅