我不确定您展示的内容是否可行?WebApiProj.Uow.Houses.GetAll() 将 Houses 视为一个带有static
GetAll 函数的类。Houses 是一个实例类,需要根据请求进行实例化,并且可能/应该也需要处理构造函数注入问题...... GetAll 通常是一个实例方法。
鉴于您将有多个代码客户端,即 WebApi 控制器和 MVC 控制器,您应该考虑将服务层添加到您的项目中。http://martinfowler.com/eaaCatalog/serviceLayer.html。
您的服务层可能会采用单个类的形式(如果这是一个小型项目,但如果需要将其拆分),它将注入存储库和基础设施代码。您最终应该得到一系列 CRUD 和 UseCase 听起来方法名称,其中包含存储库、工厂和工作单元类之间的编排逻辑。
public interface IMyServiceLayerClass
{
IEnumerable<House> GetAllHouses();
House SaveHouse(House house);
IEnumerable<Windows> GetAllHouseWindows(int houseId);
//etc
}
public class MyServiceLayerClass : IMyServiceLayerClass
{
private readonly IRepository<House> _houseRepository;
private readonly IUnitOfWork _unitOfWork;
private readonly IRepositoryTypeB _repositoryTypeB;
Public MyServiceLayerClass(IUnitOfWork unitofwork, IRepository<House> houseRepository, IRepositoryTypeB repositoryTypeB)
{
//Populate the private readonly's
}
public IEnumerable<House> GetAllHouses()
{
return _houseRepository.GetAll();
}
然后,您的两种类型的控制器可以接受 Service 类并具有非常薄的逻辑,只是为了转发到服务层。
public class HomeController : Controller
{
private readonly IMyServiceLayerClass _myServiceLayerClass;
public HomeController(IMyServiceLayerClass myServiceLayerClass)
{
_myServiceLayerClass= myServiceLayerClass;
}
public ViewResult Index()
{
return View(_myServiceLayerClass.GetAllHouses());
}
Api 也一样:
public class HouseController : ApiController
{
private readonly IMyServiceLayerClass _myServiceLayerClass;
public HouseController (IMyServiceLayerClass myServiceLayerClass)
{
_myServiceLayerClass= myServiceLayerClass;
}
public IEnumerable<House> Get()
{
return _myServiceLayerClass.GetAllHouses();
}
这将允许您跨控制器重用相同的业务逻辑和编排,将逻辑从您的 WebApi 和 Mvc 应用程序中抽象出来。
此代码可以轻松地存在于定义合同的项目中,因为它仅依赖于接口。或者您也可以将其接口添加到合同中,然后创建另一个项目类 Domain 或 Service 来保存服务类的实现。
我强烈建议你让控制器去做他们最擅长的事情,让他们处理 UI 特定元素的委托,并将非 UI 特定逻辑重构为可重用的服务层。这将允许控制器的单元测试专注于测试正确的操作结果和状态代码等,并允许独立测试您的域逻辑。