2016-06-22 5 views
14

ASP.NET/Entity Frameworkコアで基本的なUoW/Repositoryパターンを実装しようとしていますが、非常に問題が発生しました。.NETコアで間接参照されるパッケージのクラスを表示する

私のソリューションは合計4つのプロジェクトで構成されています。私のDbContextが定義されている

.DAL私のエンティティクラスが定義されているプロジェクト、および:

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参照ファサードとファサード.EFエンティティフレームワークNOT 6.1.3。 NOR .DALプロジェクト。ビルド時にEFアセンブリが自分のbinフォルダに追加されても、EFはこのプロジェクトで直接参照されません。 の.NET Framework 4.6.xの

。私はのDemoAppにApplicationDbContextに対してコードにしてみてくださいしようとした場合、それはそのクラスが定義されていない私に語った、私に期待されている追加する任意のusingsを提供していません動作。

.NET Framework 4.6.x Project

私は(Entity Frameworkのコアを使用することによって).NETコア1.0 RC2と同じことをしようとすると、ApplicationDbContextは完全に私を破壊する.DALプロジェクトへの直接参照を追加することなく、.DemoAppからアクセス可能です実装の詳細を隠そうとします。なぜ私はそこからクラスを参照させて頂いております -

enter image description here

.DALプロジェクトは直接.DemoAppプロジェクトによって参照されていませんか?

これが期待どおりの動作ですか? .NET Frameworkプロジェクトを.NET Framework 4.6.xプロジェクトと同じ動作にする方法はありますか?

+1

誰かが正解を追加しました(PrivateAssets =すべて) - それを受け入れてください。 –

+0

@PeterMorris私は答えを受け入れました。それを指摘してくれてありがとう! –

答えて

4

私は数ヶ月間これに苦労し、最終的にコアのプロジェクトの推移的な参照を無効にする方法を見つけました。 .Facade.EFための.csprojファイルで

、あなたが.DALにProjectReferenceに PrivateAssets="All"を追加することができます。

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

をこの設定では、.Facade.EFを参照するプロジェクトは、もはやあまりにも.DALを参照しません。あなたがCを参照するためにBとBを参照したいのですが、Cを参照したくない場合は、より抽象的に言えば

、これを追加します。

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

ソース:https://github.com/dotnet/project-system/issues/2313

3

これは意図された動作です。これはメタパッケージと呼ばれ、たとえばNETStandard.Libraryパッケージに基本クラスライブラリのすべてのライブラリを含めるために使用されます。私はそれらを隠す方法はないと思う。

+3

あなたの質問とは別に私の個人的な意見は、リファレンスツリーの後ろにあるアーティファクトを隠すことは、おそらく開発者の規律には役立つが、アーキテクチャ上の利点はないということです。実装(ここでは '.Facade.EF')への参照を追加すると、すべてのパターンベースの隠蔽が解除されます。あなたがIOC /依存性注入によってそれを行うならば、パターンが働き、あなたの可視性の問題は消え去ります。 'Product'クラスを隠し、' GetName'のようなリポジトリにメソッドを提供することは、リポジトリパターンを反映していないとも思います。 – Thomas

関連する問題