首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >webapi aspnet 4体系结构

webapi aspnet 4体系结构
EN

Stack Overflow用户
提问于 2012-11-19 04:14:00
回答 2查看 1.1K关注 0票数 1

我首先使用实体框架5代码、WebApi、ASPNET 4、仓库和工作单元模式等进行项目。

我的架构如下:

  • 有一个项目是给POCOS的
  • 有上下文、储存库、工作单位等的一个项目
  • 有合同的一个项目(IRepository、IUnitOfWork等)
  • 一个WebApi项目,它为模型的每个实体保存ApiControllers (GET、POST、PUT、DELETE)。

现在,如果我不想使用SPA (因为我现在没有时间学习它),并且我想做一些事情,我应该做什么呢?一个新的ASPNET 4项目,其控制器继承自Controller而不是ApiController,以及那些消耗WebApi控制器的控制器?

是像这样吗?

代码语言:javascript
复制
public ActionResult Index()
{
    return View(WebApiProj.Uow.Houses.GetAll());
}

这似乎不太好,因为它应该在另一个项目中创建一个指向WebApi控制器的Get。

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

对这个建筑有什么建议吗?赞成还是反对?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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听起来的方法名称,其中包含存储库、工厂和工作单元类之间的编排逻辑。

代码语言:javascript
复制
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();
     }

然后,您的两种类型的控制器可以接受服务类,并具有非常细的逻辑,仅用于转发到服务层。

代码语言:javascript
复制
public class HomeController : Controller
{
    private readonly IMyServiceLayerClass _myServiceLayerClass;

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

    public ViewResult Index()
    {
         return View(_myServiceLayerClass.GetAllHouses());
    }

Api也是如此:

代码语言:javascript
复制
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特定逻辑重新分解到一个可重用的服务层。这将允许控制器的单元测试集中于测试正确的操作结果和状态代码等,并允许独立测试您的域逻辑。

票数 2
EN

Stack Overflow用户

发布于 2012-11-19 14:25:52

看看my answer for another architecture question on MVC。问题的关键是要有一个应用程序或域层,MVC Controller和Web控制器都可以用来访问业务模型(MVC中的M)。您不希望直接从MVC Controller调用Web,因为它具有这里不需要的序列化和反序列化开销。相反,直接调用应用程序/域层。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13447581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档