3

我正在使用 MVC、Nhibernate 和 IOC 容器开发企业应用程序。

我三层:

DAL - 休眠数据存储库

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

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

private readonly CustomerManager _manager;

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

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

即 MVC 将尝试HomeController从 IoC 容器中获取 a ,而后者又需要 a CustomerManager... 所以 IoC 容器将尝试获取 a CustomerManager,而后者又需要 a ICustomerRepository... 所以 IoC 容器将尝试... 你得到观点。

我还将尽可能地从CustomerManagerICustomerManager可能)中提取接口以消除耦合并使控制器的测试更加容易。

于 2012-09-11T21:59:30.133 回答
1

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

于 2012-09-11T22:04:37.047 回答