我首先使用实体框架5代码、WebApi、ASPNET 4、仓库和工作单元模式等进行项目。
我的架构如下:
现在,如果我不想使用SPA (因为我现在没有时间学习它),并且我想做一些事情,我应该做什么呢?一个新的ASPNET 4项目,其控制器继承自Controller而不是ApiController,以及那些消耗WebApi控制器的控制器?
是像这样吗?
public ActionResult Index()
{
return View(WebApiProj.Uow.Houses.GetAll());
}这似乎不太好,因为它应该在另一个项目中创建一个指向WebApi控制器的Get。
我在考虑这种架构,因为移动客户端、web客户端和任何其他客户端都会调用相同的服务,这听起来不错。
对这个建筑有什么建议吗?赞成还是反对?
发布于 2012-11-19 10:09:37
我不确定你展示的东西是否有可能?WebApiProj.Uow.Houses.GetAll()处理房屋就好像它是一个带有static GetAll函数的类。House是一个实例类,需要对每个请求进行实例化,并且可能/应该有构造函数注入的关注点来处理.GetAll通常是一个实例方法。
如果您的情况是要有多个代码客户端,即WebApi控制器和MVC控制器,那么您应该考虑在项目中添加一个服务层。http://martinfowler.com/eaaCatalog/serviceLayer.html。
您的服务层可能会采用单个类的形式(如果这是一个小的ish项目,但如果需要,则将其拆分),它将被注入存储库和基础结构代码。您应该最终得到一系列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();
}然后,您的两种类型的控制器可以接受服务类,并具有非常细的逻辑,仅用于转发到服务层。
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应用程序中抽象出来。
此代码可以轻松地存在于定义契约的项目中,因为它只依赖于接口。或者,您也可以将它的接口添加到契约中,然后创建另一个项目类、域或服务,它们可以保存服务类的实现。
我强烈建议您让控制器来做他们做得最好的事情,让他们将UI特定元素的委托和非UI特定逻辑重新分解到一个可重用的服务层。这将允许控制器的单元测试集中于测试正确的操作结果和状态代码等,并允许独立测试您的域逻辑。
发布于 2012-11-19 14:25:52
看看my answer for another architecture question on MVC。问题的关键是要有一个应用程序或域层,MVC Controller和Web控制器都可以用来访问业务模型(MVC中的M)。您不希望直接从MVC Controller调用Web,因为它具有这里不需要的序列化和反序列化开销。相反,直接调用应用程序/域层。
https://stackoverflow.com/questions/13447581
复制相似问题