小编sta*_*xed的帖子

Rest API和DDD

在我的项目中使用DDD方法.

该项目有聚合(实体)交易.这个聚合有很多用例.

对于这个聚合,我需要创建一个rest api.

用标准:创建和删除没问题.

1)CreateDealUseCase(名称,价格和许多其他参数);

POST /rest/{version}/deals/
{ 
   'name': 'deal123',
   'price': 1234;
   'etc': 'etc'
}
Run Code Online (Sandbox Code Playgroud)

2)DeleteDealUseCase(id)

DELETE /rest/{version}/deals/{id}
Run Code Online (Sandbox Code Playgroud)

但是如何处理其他用例呢?

  • HoldDealUseCase(id,reason);
  • UnholdDealUseCase(ID);
  • CompleteDealUseCase(id,以及许多其他参数);
  • CancelDealUseCase(id,amercement,reason);
  • ChangePriceUseCase(id,newPrice,reason);
  • ChangeCompletionDateUseCase(id,newDate,amercement,whyChanged);
  • 等(共20个用例)......

有什么解决方案?

1)使用动词:

PUT /rest/{version}/deals/{id}/hold
{ 
   'reason': 'test'
}
Run Code Online (Sandbox Code Playgroud)

但!动词不能在url中使用(在REST理论中).

2)使用完成状态(将在用例之后):

PUT /rest/{version}/deals/{id}/holded
{ 
   'reason': 'test'
}
Run Code Online (Sandbox Code Playgroud)

就个人而言,它看起来很难看.也许我错了?

3)对所有操作使用1 PUT请求:

PUT /rest/{version}/deals/{id}
{ 
   'action': 'HoldDeal',
   'params': {'reason': 'test'}
}

PUT /rest/{version}/deals/{id}
{ 
   'action': 'UnholdDeal',
   'params': {}
}
Run Code Online (Sandbox Code Playgroud)

在后端很难处理.而且,很难记录.由于1个动作具有许多不同的请求变体,因此已经依赖于特定的响应.

所有解决方案都有明显的缺点.

我在网上看过很多关于REST的文章.到处都只有一个理论,如何与我的具体问题在一起?

api rest domain-driven-design

35
推荐指数
2
解决办法
2万
查看次数

DDD存储库和工厂

在我的应用程序中有几层.本主题将重点介绍域和基础结构层.

我在域层中有存储库接口ClientRepositoryInterface.我在Infrastructure层中实现了此接口ClientRepositoryImpl.

但是为了在其存在的循环中间重建对象,我需要工厂(ReconstitutionClientFactory).调用工厂将在存储库中.埃里克埃文斯的书被描述为正常的做法.

但是应该找到这个工厂(ReconstitutionClientFactory)?在域或基础架构层?

我想在Domain ...但是!但是下层会直接调用更高层!这是错的,但怎么做对了?

domain-driven-design ddd-repositories repository-pattern factory-pattern

12
推荐指数
2
解决办法
7773
查看次数

将业务逻辑与PHP Doctrine 2分开

我使用symfony 2.3和php doctrine 2.

该计划有以下型号:

  • 实体订单 - 典型的客户订单
  • 实体BadOrderEntry(字段:id,order - 与Order的单向一对一关系,createdAt)
  • 工厂BadOrderEntryFactory用于创建实体BadOrderEntry
  • 存储库BadOrderEntryRepository,用于实体BadOrderEntry的搜索方法
  • 管理器BadOrderEntryManager用于保存/编辑/删除实体BadOrderEntry的方法
  • AND MAIN CLASS BadOrderList - 错误订单列表,此类代码:

    private $factory;
    private $repository;
    private $manager;
    
    public function __construct(
        BadOrderEntryFactory $f,
        BadOrderEntryRepository $r,
        BadOrderEntryManager $m
    ) {
        $this->factory = $f;
        $this->repository = $r;
        $this->manager = $m;
    }
    
    public function has(Order $order)
    {
        return $this->repository->existsByOrder($order);
    }
    
    public function add(Order $order)
    {
        if (! $this->has($order)) {
            $entry = $this->factory->create($order);
            $this->manager->save($entry);
        }
    }
    
    public function remove(Order $order)
    {
        $entry = $this->repository->findOneByOrder($order);
        if ($entry …
    Run Code Online (Sandbox Code Playgroud)

php orm datamapper symfony doctrine-orm

7
推荐指数
1
解决办法
569
查看次数

C#中异常层次结构的良好实践

现在我在PHP之后编写C#代码.

在PHP中,我创建了一个由Zend Framework的建议引导的异常层次结构(Symfony现在使用类似的东西).

在包中(例如Order)我在这个文件夹中创建文件夹Exception(从php转换为C#):

namespace Order.Exception
{
    interface ExceptionInterface{}
    class ApplicationException : System.ApplicationException, ExceptionInterface{}
    class OrderNotFoundException : ApplicationException {}
    class SomethingHappensException : ApplicationException{}
}
Run Code Online (Sandbox Code Playgroud)

我需要很多例外(相对)来方便地从域中表达事物.

是否有任何良好实践来创建异常层次结构?

创作的技术细节我完全理解.良好做法的问题.

c# exception-handling exception

3
推荐指数
1
解决办法
687
查看次数