0

サービスレイヤでDbContextを公開するのは悪い習慣ですか?例についてはAsp.net mvc EF4.1 DbContextとサービスレイヤ

ここ
private readonly IRepository<SkillLevels> _repository; 
private readonly IDatabaseFactory _databaseFactory; 
private readonly IUnitOfWork _unitOfWork; 

public SkillLevelService(IRepository<SkillLevels> repository, IDatabaseFactory databaseFactory, IUnitOfWork unitOfWork) 
{ 
    _repository = repository; 
    _databaseFactory = databaseFactory; 
    _unitOfWork = unitOfWork; 
} 

public void InsertSkillLevel(SkillLevels entity) 
{ 
    _repository.Insert(entity); 
    _unitOfWork.Commit(); 
} 

、IDatabaseFactoryは私のDbContextオブジェクトを返すことができます。 SkillLevels以外のエンティティが必要な場合は、このサービスクラスで使用できるように、私はここに公開しました。あなたが知っている場合は、データをフェッチするために複数のテーブルを選択する必要がある複雑なクエリの場合。

しかし、それが悪い練習をするかどうかはわかりません!

何か助けていただければ幸いです。ありがとう。

答えて

0

一般的なリポジトリを使用しています。単純なケースでは機能しますが、結合を行う必要があるかどうかを言ったように、このアプローチは機能しません。だから、1つの改良は、特定のレポ

public interface ISkillLevelsRepository : IRepository<SkillLevels> 
{ 
    //have specific methods to achieve what you want 
} 

別のアプローチは、あなたのサービスクラス内の複数のリポジトリを使用してFactoryを削除するだろうを作成することです。

private readonly IRepository<SkillLevels> _skillsRepository; 
private readonly IRepository<Student> _studentRepository; 
private readonly IUnitOfWork _unitOfWork; 

public SkillLevelService(IRepository<SkillLevels> skillsRepository, IRepository<Student> studentRepository, IUnitOfWork unitOfWork) 
{ 
    _skillsRepository= skillsRepository; 
    _studentRepository = studentRepository; 
    _unitOfWork = unitOfWork; 
} 

次に、必要な機能を実現する複数のreposにアクセスします。

ナビゲーション項目を参照するときにEFが結合を追加するため、ほとんどすべてのナビゲーション項目でモデルを正しく定義した場合、ジョインを行う必要はほとんどありません。

+0

ありがとうございます。私はあなたが言及した両方のアプローチについて知っていた。しかし、個人的には私は第2のアプローチが嫌いです。真実を伝えるようにします。私はContextオブジェクトを使うのが好きです。私はそれで安全だと感じています。:D もう一つ、このサービスは、これらの2つのリポジトリでは回避策となるかもしれません。しかし、将来、このサービスはより多くのリポジトリを必要とするかもしれません。私は再びコンストラクタにそれらを追加する必要があります。 – nznoor

+0

あなたの最初のappraochについて私はそれが良いのが好きです。これよりも理解しやすくなるオープンソースサンプルアプリをご存知ですか? – nznoor

+0

@ Nazmoon申し訳ありません、私はサンプルを思い出すことができません。構造はあなたのドメインに依存します – Eranga

関連する問題