我正在使用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引用。这种架构是否正常或有更好的方法来实现它?
答案 0 :(得分:5)
您不应该在控制器中拥有/ IUnitOfWork
或ICustomerRepository
,使用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类中调用相当高级的方法。