3

MVC、Nhibernate、IOC コンテナーを使用してエンタープライズ アプリケーションに取り組んでいます。

私は 3 つの層:

DAL - Nhibernate データ リポジトリ

public class CustomerRepository : Repository<int>,ICustomerRepository
{
    public CustomerRepository(IUnitOfWork unitOfWork)
        : base(unitOfWork)
    {

    }
}

BLL - ビジネス層

public class CustomerManager
{
    private readonly ICustomerRepository _repository;
    public CustomerManager(ICustomerRepository repository)
    {
        _repository = repository;
    }
    public IList<Customer> GetAll()
    {
        return _repository.GetAll<Customer>();
    }
}

プレゼンテーション - MVC コントローラー

private readonly IUnitOfWork _unitOfWork;
private readonly ICustomerRepository _repository;
private readonly CustomerManager _manager;

public HomeController(IUnitOfWork unitOfWork, ICustomerRepository repository)
    {
        _unitOfWork = unitOfWork;
        _repository = repository;
        _manager = new CustomerManager(_repository);
    }

IOC コンテナーを使用して、作業単位と CustomerRepository オブジェクトを登録しています。IOC コンテナは正常に動作しています。

このソリューションについて私を悩ませているのは、コントローラーに CustomerRepository 参照があることです。このアーキテクチャは問題ありませんか、それともこれを実装するためのより良い方法がありますか?

4

2 に答える 2

5

IUnitOfWorkコントローラーにorは必要ありません。IoC コンテナーを使用すると、を登録してからこれを実行ICustomerRepositoryできるはずです。CustomerManager

private readonly CustomerManager _manager;

public HomeController(CustomerManager customerManager)
{
    _manager = customerManager;
}

IoC コンテナーは、依存関係チェーンを理解し、必要に応じてさまざまな依存関係をすべて挿入する必要があります。

つまり、MVC はHomeControllerIoC コンテナーからを取得しよCustomerManagerうとしますがCustomerManager、これには ... が必要ICustomerRepositoryです。したがって、IoC コンテナーは を取得しようとします。点。

CustomerManagerまた、 (おそらく)からインターフェイスを抽出しICustomerManagerて、カップリングを削除し、コントローラーのテストをさらに簡単にします。

于 2012-09-11T21:59:30.133 に答える
1

すべてのビジネスロジックはManagerクラスに含まれている必要があるため、コントローラーのリポジトリに依存する必要はありません。コントローラは、Managerクラスのかなり高レベルのメソッドを呼び出す必要があります。

于 2012-09-11T22:04:37.047 に答える