0

サービス層で 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 以外のエンティティが必要な場合に、このサービス クラスで使用できるようにするためです。ご存じのとおり、データを取得するために複数のテーブルを選択する必要がある複雑なクエリの場合。

しかし、それが悪い習慣になるかどうかはわかりません!!

どんな助けでも大歓迎です。ありがとう。

4

2 に答える 2

0

私が見ている問題の1つは、汎用リポジトリを使用していることです。単純なケースでは機能しますが、結合を実行する必要がある場合、このアプローチは機能しません。したがって、1つの改善は、特定のリポジトリを作成することです。

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

もう1つのアプローチは、サービスクラス内で複数のリポジトリを使用し、を削除すること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;
}

次に、複数のリポジトリにアクセスして、必要なものを実現します。

すべてのナビゲーションフィールドでモデルを正しく定義した場合、ナビゲーションプロパティを参照するときにEFが結合を追加するため、結合を行う必要がほとんどない場合があります。

于 2011-08-07T03:36:16.077 に答える
0

Web アプリケーションでは、リクエストごとに 1 つの DBContext を使用して BeginRequest で作成し、それをリクエスト内のすべての呼び出しに渡し、EndRequest で破棄するのが一般的です。

この例を参照してくださいASP.NET MVC での要求ごとに 1 つの DbContext (IOC コンテナーなし)

于 2011-08-07T09:30:48.133 に答える