顯示.NET Core中間接引用的包的類

.net .net-core asp.net-core c# entity-framework-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<Product> 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引用實體框架6.1.3。

  • .Facade沒有引用任何東西。

  • .Facade.EF引用.DAL項目,.Facade項目和實體框架6.1.3。

  • .DemoApp引用Facade和Facade.EF但不是實體框架6.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:

<ItemGroup>
  <ProjectReference Include="..\.DAL\.DAL.csproj" PrivateAssets="All" />
</ItemGroup>

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

在更抽象的術語中,如果您希望A引用B和B來引用C,但不希望A引用C,請添加以下內容:

在B.csproj

<ItemGroup>
  <ProjectReference Include="..\C\C.csproj" PrivateAssets="All" />
</ItemGroup>

資料來源: https//github.com/dotnet/project-system/issues/2313


熱門答案

這是預期的行為。它被稱為元包,例如用於NETStandard.Library包以包含基類庫的所有庫。我認為沒有辦法隱藏它們。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow