Отображение классов из косвенно связанных пакетов в .NET Core

Я пытаюсь реализовать базовый шаблон UoW/Repository с помощью ASP.NET/Entity Framework Core, и я столкнулся с очень тревожным поведением.

Мое решение состоит всего из 4 проектов.

.DAL project, где определены классы сущности и где определяется мой 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);
}

.Facade.EF, где мой Фасад реализован с помощью 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 Framework 6.1.3.

  • .Facade ничего не ссылается.

  • .Facade.EF ссылки. Проект DAL, проект Facade и Entity Framework 6.1.3.

  • .DemoApp ссылается на Facade и Facade.EF, но не на Entity Framework 6.1.3. Проект NOR.DAL. Несмотря на то, что сборки EF добавляются в мою папку bin при сборке, EF напрямую не ссылается на этот проект.

С .NET Framework 4.6.x., если я попытаюсь выполнить код с помощью ApplicationDbContext в DemoApp, он сообщает мне, что класс не определен и не предоставляет мне никаких добавлений, которые будут добавлены, ожидаемое поведение.

.NET Framework 4.6.x Project

Если я попытаюсь сделать то же самое с .NET Core 1.0 RC2 (используя ядро ​​Entity Framework), ApplicationDbContext доступен из .DemoApp без добавления прямой ссылки на проект .DAL, который полностью разрушает мою попытку для скрытия деталей реализации.

введите описание изображения здесь

. Проект DAL напрямую не ссылается на проект .DemoApp - почему мне разрешено видеть в нем классы?

Является ли это ожидаемым поведением? Есть ли способ сделать проекты .NET Core иметь такое же поведение, что и проекты .NET Framework 4.6.x?

Ответы

Ответ 1

Я боролся с этим в течение нескольких месяцев и, наконец, нашел способ отключить переходные ссылки проектов в Core.

В файле .csproj для .Facade.EF вы можете добавить PrivateAssets="All" в ProjectReference в .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

Ответ 2

Это предполагаемое поведение. Он называется метапакетами и используется, например, для пакета NETStandard.Library для включения всех библиотек библиотеки базового класса. Я не думаю, что есть способ их спрятать.