Отображение классов из косвенно связанных пакетов в .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
для включения всех библиотек библиотеки базового класса. Я не думаю, что есть способ их спрятать.