鉴于我有一个.NET Core 2.0应用程序的情况 我还有一个Web程序集,一个Business程序集和一个DataAccess程序集。
我不希望Web程序集直接引用我的DataAccess程序集(其中包含我的Entity Framework内容)。这样可以保护Web程序集不会使用快捷方式并直接与DbContext交谈。
所以我的Web引用业务和业务引用了DataAccess。
现在由于一些奇怪的原因,在我的Web项目的控制器中,我仍然可以直接访问DbContext,因为这在我的DataAccess项目中被标记为公共,显然它是通过某种形式的嵌套提供给Web项目的引用。
我想这一个类似的话题是:https://github.com/aspnet/Mvc/issues/6635但我在Stack Overflow上找不到这个主题。
是否有任何优雅的方法可以阻止顶层项目访问这些嵌套依赖项?
答案 0 :(得分:2)
为了防止从Web层显示DataAccess层,应将PrivateAssets元素放在业务层的.csproj文件中。就像下面的代码一样。
<ItemGroup>
<ProjectReference Include="..\GiveAway.Data\GiveAway.Data.csproj">
<PrivateAssets>all</PrivateAssets>
</ProjectReference>
</ItemGroup>
在这里您可以阅读有关PrivateAssets元素的更多信息:https://docs.microsoft.com/en-us/dotnet/core/tools/csproj
答案 1 :(得分:0)
这就是您使用接口而不是注入具体对象的原因。您不应该在DataAccess程序集之外泄漏对DBContext的引用。这意味着您与更高层中的底层数据库的耦合太多。