3

このことのいくつかを理解するのを手伝ってくれてありがとう:

MVC アプリケーションに 2 つのコントローラーがあるとします。1 つは営業担当者に関連するビューモデルを制御します。

それぞれに独自のリポジトリがあり、エンティティ フレームワーク (コード ファースト) を使用してデータにアクセスします。

両方のリポジトリは、依存関係の挿入を処理するように設定されていますが、適切な EF dataAccess を使用するためのデフォルトの 0 引数コンストラクターもあります。

営業担当者コントローラーは、_salesPeopleRepository.getAllSalesPeople() 関数を使用して、営業担当者のリストを返し、インデックス ビューに入力します。

セールス コントローラーは、同じリストにアクセスしてドロップダウン リストに入力する必要があります。

情報をセールス コントローラーに渡すにはいくつかの方法があります。

a) コントローラー内

db = new DataContext();
_saleRepos = new SalesRepository(db);
_salesPeople = new SalesPeopleRepository(db);
 .....
modelA.SalePeopleSelectList = SelectList(_salesPeople.getAllSalesPeople(),"id","name")

b) SalesRepository 内 - EF 自体を使用:

public IEnumerable<salesPerson> getAllSalesPeople()
{ 
    return _db.SalesPeople.ToList();
}

c) または、関数を呼び出す前に同じデータ アクセス オブジェクトをインスタンス化して注入する

public IEnumerable<salesPerson> getAllSalesPeople()
{ 
    return (new SalesPersonRepository(_db)).getAllSalesPeople();
}

編集

答えが a) の場合、カスタム ビジネス ロジックを 1 つのリポジトリからどのように呼び出す必要がありますか。たとえば、sales に storeId があり、リポジトリは、sales に入力された storeId が salesPerson の storeId と一致することを確認します。ビジネス ロジックの目的で使用される (salesRepository 内の) salesPerson オブジェクトには、salesPerson リポジトリ経由でアクセスする必要がありますか、それとも dataContext オブジェクトから直接アクセスする必要がありますか?

あなたの考えと経験をありがとう

4

3 に答える 3

5

テーブルSalesRepositoryからデータを取得するのは意味がありません。SalesPersonそのデータ アクセス ロジックは、SalesPeopleRepository. 私の意見では、リポジトリ間でメソッドを複製すると、水が濁るだけです。

それでは、セールス コントローラでとの両方SalesRepositoryを使用してみませんか? SalesPeopleRepositoryのインスタンスをインスタンス化しSalesPeopleRepository、そこで既に定義されているメソッドを使用するだけです。

また、コントローラーが依存性注入を使用している場合は、リポジトリーをコンストラクターに渡すだけで済みます。

public SalesController (ISalesRepository salesRepository, ISalesPeopleRepository salesPeopleRepository)
{
   this._salesRepository = salesRepository;
   this._salesPeopleRepository = salesPeopleRepository;
}
于 2012-08-07T01:09:25.907 に答える
2

ベスト プラクティスは常にコンテキストに依存しますが、リポジトリパターンと作業単位パターンの組み合わせが EF の上で定期的に使用されます。

使用法:

using (var uow as new DataContext()) {
    var salesPeople = new SalesPeopleRepository(uow);

    // ...

    uow.Commit(); // If changes must be committed back to the database
}

実装:

public interface IUnitOfWork {
    public void Commit();
}

public class DataContext : IUnitOfWork {
    public void Commit() {
        this.SaveChanges();
    }
}

public class SalesPeopleRepository {

    private DataContext _db

    public SalesPeopleRepository(IUnitOfWork uow) {
        _db = uow as DataContext;
    }

    public IEnumerable<SalesPerson> GetAllSalesPeople() { 
        return _db.SalesPeople.ToList();
    }
}
于 2012-08-07T06:39:25.460 に答える
1

まず、C# の命名規則に従う必要があります。getAllSalesPeople() は GetAllSalesPeople にする必要があります。次に、IoC コンテナーと依存関係の挿入は、この場合のベスト プラクティスです。

DataContext と Repositories はコントローラーで直接作成されるため、回避する必要があります。依存性注入に違反し、コードを Repositories と DataContext と密結合させ、単体テスト用にモックする方法がありません。代わりに、リポジトリをコントローラーに注入し、DataContext をリポジトリに注入する必要があります。

public Repository(DataContext dataContext)
{
    _dataContext = dataContext;
}

public SalesController(ISalesRepository salesRepository, 
                          ISalesPeopleRepository salesPeopleRepository) 
{ 
   _salesRepository = salesRepository; 
   _salesPeopleRepository = salesPeopleRepository; 
} 

DataContext の有効期間管理は、コントローラーで直接作成するのではなく、IoC コンテナーの要求ごとに保持する必要があります。ほとんどの IoC コンテナーはこれをサポートしています。どの IoC コンテナーを使用しているかはわかりませんが、私のお気に入りは Autofac と Windsor です。

項目cについては、ビジネス ロジックをリポジトリ レイヤーにリークさせています。代わりに、ビジネス ロジックはコントローラーまたは別のレイヤーにある必要があります。リポジトリは、データベースで CRUD 操作を処理するだけです。

于 2012-08-07T05:55:07.740 に答える