3

我正在使用MVC,Nhibernate和IOC容器開發企業應用程序。在MVC控制器中擁有存儲庫引用

我三個層次:

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對象。國際奧委會容器工作正常。

對此解決方案的疑惑是我在控制器中引用了CustomerRepository參考。這個架構是否合適,或者有更好的方法來實現呢?

回答

5

你不應該需要/在控制器中的IUnitOfWorkICustomerRepository,與IoC容器,你應該能夠註冊CustomerManager然後做到這一點:

private readonly CustomerManager _manager; 

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

的IoC容器應該明白的依賴鏈並根據需要注入所有各種依賴。

I.e. MVC將嘗試從IoC容器中獲得HomeController,後者又需要CustomerManager ...因此IoC容器將嘗試獲得CustomerManager,而該容器又需要ICustomerRepository ...因此IoC容器將嘗試...你明白了。

我也想從CustomerManagerICustomerManager很可能)中提取一個接口的程度,以刪除耦合並使測試Controller變得更容易。

+0

由於不是所有這些ASP.NET的原生東西..我假設你們使用名稱'經理'來描述服務層結構的類,或者我有困惑嗎? –

+0

@tereško我只是簡單地複製問題中的內容。我不會說這是一個_ASP.NET thing_。事實上,我通常會說,超出UI級別的ASP.NET(MVC)命名約定不應該偏離其他語言......它們都是一樣的:-) – Charlino

1

您的所有業務邏輯都應該位於Manager類中,因此您不應該在控制器中需要對存儲庫的依賴關係。控制器應該在Manager類中調用相當高級的方法。

相關問題