显示.NET Core中间接引用的包的类

我试图用ASP.NET / Entity Framework Core实现基本的UoW / Repository模式,我遇到了非常令人不安的行为。

我的解决方案共包含4个项目。

.DAL项目 ,我的实体类被定义,我的DbContext定义在哪里:

public class Product { public int Id { get; set; } public string Name { get; set; } } public class ApplicationDbContext : DbContext { public DbSet Products { get; set; } } 

.Facade项目,我的IUnitOfWork和IProductRepository定义在:

 public interface IUnitOfWork { IProductRepository Products { get; } } public interface IProductRepository { string GetName(int id); } 

.Fadeade.EF项目,我的Facade用EF实现:

 public class UnitOfWork : IUnitOfWork { private ApplicationDbContext _context; public IProductRepository Products { get; private set; } internal ApplicationDbContext Context { get { return _context; } } public UnitOfWork() { _context = new ApplicationDbContext(); Products = new ProductRepository(this); } } public class ProductRepository : IProductRepository { private ApplicationDbContext _context; public ProductRepository(UnitOfWork uow) { _context = uow.Context; } public string GetName(int id) { return _context.Products .Where(x => x.Id == id) .Select(x => x.Name) .FirstOrDefault(); } } 

.DemoApp项目应该是我的应用程序代码。 这个项目应该只知道UnitOfWork和UserRepository而不是ApplicationDbContext类。

  • .DAL引用entity framework6.1.3。

  • .Facade没有引用任何东西。

  • .Facade.EF引用.DAL项目,.Facade项目和entity framework6.1.3。

  • .DemoApp引用Facade和Facade.EF但不是entity framework6.1.3。 NOR .DAL项目。 即使在构建时将EF程序集添加到我的bin文件夹中,此项目也不会直接引用EF。

使用.NET Framework 4.6.x。 ,如果我尝试在DemoApp中对ApplicationDbContext进行编码,它会告诉我该类未定义,并且没有为我提供任何要添加的预期行为。

.NET Framework 4.6.x项目

如果我尝试使用.NET Core 1.0 RC2 (通过使用Entity Framework Core),可以从.DemoApp访问ApplicationDbContext,而无需添加对.DAL项目的直接引用,这完全破坏了我隐藏实现细节的尝试。

在此处输入图像描述

.DAL项目没有被.DemoApp项目直接引用 – 为什么我可以在那里看到它的类?

这是预期的行为吗? 有没有办法让.NET Core项目具有与.NET Framework 4.6.x项目相同的行为?

几个月来我一直在苦苦挣扎,终于找到了一种方法来禁用Core中项目的传递引用。

在.Facade.EF的.csproj文件中,您可以将ProjectAsference的PrivateAssets="All"添加到.DAL:

    

使用此设置,引用.Facade.EF的项目也不再引用.DAL。

在更抽象的术语中,如果您希望A引用B和B来引用C,但不希望A引用C,请添加以下内容:

在B.csproj

    

资料来源: https : //github.com/dotnet/project-system/issues/2313

这是预期的行为。 它被称为元包,例如用于NETStandard.Library包以包含基类库的所有库。 我认为没有办法隐藏它们。