Asp.net mvc 4 webapi aspnet 4体系结构

Asp.net mvc 4 webapi aspnet 4体系结构,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,我曾经使用EntityFramework5CodeFirst、WebApi、ASPNETMVC4、存储库和工作单元模式等开发过这个项目 我的架构如下: POCOS的一个项目 一个包含上下文、存储库、工作单元等的项目 一个有合同的项目(i存款、i工作等) 一个WebApi项目,它为模型的每个实体(GET、POST、PUT、DELETE)保存APICONTROLLER 现在,如果我不想使用SPA(因为我现在没有时间学习),我想快速做一些事情,我该怎么办?一个新的ASPNET MVC 4项目,其中

我曾经使用EntityFramework5CodeFirst、WebApi、ASPNETMVC4、存储库和工作单元模式等开发过这个项目

我的架构如下:

  • POCOS的一个项目
  • 一个包含上下文、存储库、工作单元等的项目
  • 一个有合同的项目(i存款、i工作等)
  • 一个WebApi项目,它为模型的每个实体(GET、POST、PUT、DELETE)保存APICONTROLLER
现在,如果我不想使用SPA(因为我现在没有时间学习),我想快速做一些事情,我该怎么办?一个新的ASPNET MVC 4项目,其中控制器继承自Controller而非ApicController,并且这些控制器使用WebApi控制器

像这样

public ActionResult Index()
{
    return View(WebApiProj.Uow.Houses.GetAll());
}
这似乎不是很好,因为它应该在另一个项目中创建指向WebApi控制器的Get

我在考虑这种架构,因为移动客户端、web客户端和任何其他客户端都会调用相同的服务,这听起来不错


对这种架构有什么建议吗?赞成还是反对?

我不确定你所展示的是否可行?WebApiProj.Uow.Houses.GetAll()将Houses视为一个带有
static
GetAll函数的类。Houses是一个实例类,每个请求都需要实例化,并且可能/应该也需要处理构造函数注入问题。。。GetAll通常是一个实例方法

假定你处于一个你将拥有多个代码客户端(即WebAPI控制器和MVC控制器)的情况下,你应该考虑向你的项目添加一个服务层。p> 您的服务层可能采用单个类的形式(如果这是一个小的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();
     }
Api也一样:

public class HouseController : ApiController
{
    private readonly IMyServiceLayerClass _myServiceLayerClass;

    public HouseController (IMyServiceLayerClass myServiceLayerClass)
    {
        _myServiceLayerClass= myServiceLayerClass;
    }

    public IEnumerable<House> Get()
    {
         return _myServiceLayerClass.GetAllHouses();
    }
公共类房屋控制器:ApiController
{
私有只读IMyServiceLayerClass(myServiceLayerClass);
公共场所控制员(IMyServiceLayerClass myServiceLayerClass)
{
_myServiceLayerClass=myServiceLayerClass;
}
公共IEnumerable Get()
{
return _myServiceLayerClass.GetAllHouses();
}
这将允许您跨控制器重用相同的业务逻辑和编排,并将逻辑从WebApi和Mvc应用程序中抽象出来

此代码可以很容易地存在于定义契约的项目中,因为它仅依赖于接口。或者您也可以将其接口添加到契约中,然后创建另一个项目类域或服务,该域或服务可以容纳服务类的实现


我强烈建议您让控制器做他们最擅长的事情,让它们处理UI特定元素的委托,并将非UI特定逻辑重新考虑到可重用的服务层中。这将允许控制器的单元测试专注于测试正确的操作结果和状态代码等,并允许您的域登录c将被独立测试。

看一看。你的问题的关键是要有一个MVC控制器和Web API控制器都可以用来访问业务模型(MVC中的M)的应用程序或域层。您不想直接从MVC控制器调用Web API,因为它有序列化和反序列化的开销,这在这里是不需要的。而是直接调用应用程序/域层。

这就是我试图实现的,我没有得到的是:APIController不是服务层吗?他们有CRUD操作s、 我的意思是,服务层和APIController之间有什么区别?谢谢你的回答!有点,是的!有点,从某种意义上说,它们只允许你访问特定于控制器的方法,例如,房屋控制器是一种房屋的服务类,但添加门等及其新控制器,然后您也需要转发到这些控制器…服务类可以抽象出整个域房屋、门和窗等…我添加了关于GetAll不是静态的以及您的方法是否实际可行的注释。还添加了注释re:pro的服务类和单元测试非常感谢您的回答!最后一个问题,哪一个VS2012模板最适合创建服务层?很好的绘图,我喜欢,答案与Mark相似。谢谢!
public class HouseController : ApiController
{
    private readonly IMyServiceLayerClass _myServiceLayerClass;

    public HouseController (IMyServiceLayerClass myServiceLayerClass)
    {
        _myServiceLayerClass= myServiceLayerClass;
    }

    public IEnumerable<House> Get()
    {
         return _myServiceLayerClass.GetAllHouses();
    }