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

时间:2012-09-11 21:51:54

标签: asp.net-mvc model-view-controller nhibernate design-patterns architecture

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

我三层:

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引用。这种架构是否正常或有更好的方法来实现它?

2 个答案:

答案 0 :(得分:5)

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

private readonly CustomerManager _manager;

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

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

即。 MVC将尝试从IoC容器中获取HomeController,而IoC容器又需要CustomerManager ...因此IoC容器将尝试获得CustomerManager,而ICustomerRepository又需要CustomerManager {1}} ...所以IoC容器会尝试......你明白了。

我也会从ICustomerManager(可能是{{1}})中提取界面,以删除耦合并使Controller更容易测试。

答案 1 :(得分:1)

您的所有业务逻辑都应该在Manager类中,因此您不需要依赖控制器中的Repository。控制器应该只是在Manager类中调用相当高级的方法。