在MVC控制器中具有存储库引用

use*_*975 3 architecture nhibernate model-view-controller asp.net-mvc design-patterns

我正在使用MVC,Nhibernate和IOC容器进行企业应用程序.

我三层:

DAL - Nhibernate数据存储库

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

    }
}
Run Code Online (Sandbox Code Playgroud)

BLL - 业务层

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

演示 - 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);
    }
Run Code Online (Sandbox Code Playgroud)

我正在使用IOC容器来注册工作单元和CustomerRepository对象.国际奥委会集装箱工作正常.

关于这个解决方案的问题是我在控制器中有CustomerRepository引用.这种架构是好还是有更好的方法来实现它?

Cha*_*ino 5

您不应该需要/拥有IUnitOfWorkICustomerRepository在控制器中,使用IoC容器,您应该能够注册CustomerManager,然后执行此操作:

private readonly CustomerManager _manager;

public HomeController(CustomerManager customerManager)
{
    _manager = customerManager;
}
Run Code Online (Sandbox Code Playgroud)

IoC容器应该理解依赖链并根据需要注入所有各种依赖项.

即MVC将尝试HomeController从IoC容器中获取一个,而IoC容器又需要CustomerManager...因此IoC容器将尝试获取a CustomerManager,而这又需要ICustomerRepository...所以IoC容器将尝试...你得到了点.

我也会从CustomerManager(ICustomerManager可能)提取接口的程度去除耦合并使Controller更容易测试.