在我的项目中使用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)
但是如何处理其他用例呢?
有什么解决方案?
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的文章.到处都只有一个理论,如何与我的具体问题在一起?
在我的应用程序中有几层.本主题将重点介绍域和基础结构层.
我在域层中有存储库接口ClientRepositoryInterface.我在Infrastructure层中实现了此接口ClientRepositoryImpl.
但是为了在其存在的循环中间重建对象,我需要工厂(ReconstitutionClientFactory).调用工厂将在存储库中.埃里克埃文斯的书被描述为正常的做法.
但是应该找到这个工厂(ReconstitutionClientFactory)?在域或基础架构层?
我想在Domain ...但是!但是下层会直接调用更高层!这是错的,但怎么做对了?
domain-driven-design ddd-repositories repository-pattern factory-pattern
我使用symfony 2.3和php doctrine 2.
该计划有以下型号:
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之后编写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)
我需要很多例外(相对)来方便地从域中表达事物.
是否有任何良好实践来创建异常层次结构?
创作的技术细节我完全理解.良好做法的问题.