目前使用C#和dotnet Core设置新的Web Api。我在引用其他项目时会注意到一些奇怪的行为。
我的解决方案非常简单:DataAccess,BusinessLogic,WebApi
WebApi项目引用了BusinessLogic项目,BusinessLogic项目引用了DataAccess项目。
现在使用以前版本的.NET,我的WebApi项目无法访问DataAccess项目中的任何内容,但在我当前的设置中,我可以访问WebApi项目中的DataAccess项目,而无需引用它。
有人可以解释一下这种行为以及可能的预防措施吗?
答案 0 :(得分:2)
这就是通过引用Microsoft.AspNetCore.All来获取所有AspNetCore包的方法。
Microsoft文档详细提及Metapackaging。
另请注意,由于应用程序的组合根是WebAPI,因此您希望它查看来自DataAccess的类型,以便您可以使用容器注册它们。
另一种方法是在您的BusinessLogic上使用持久性抽象。并反转BusinessLogic和DataAccess的引用(高级模块不应依赖于低级模块)。
类似的东西:
BusinessLogic:
数据访问:
现在,WebAPI项目可以引用DataAccess和BusinessLogic并注册容器:
Register<IUserRepository, UserRepository>();
你可以更进一步,只为接口提供DataAccess.Abstractions,但这取决于你的项目以及你想走多远。
答案 1 :(得分:0)
找到了一种防止此线程中此行为的方法:Disable transitive project reference in .NET Standard 2
编辑项目文件时,可以将PrivateAssets
属性设置为All
,以防止此行为。
<ItemGroup>
<ProjectReference Include="..\DataAccess\1-DataAccess.csproj" PrivateAssets="All" />
</ItemGroup>