TL; DR; 我正在寻找DDD node.js应用程序的一些例子.
嗨,
我要创建节点应用程序.我想知道我找不到任何在域中分离业务逻辑的应用程序示例.
好的,有一些例子:https: //github.com/adrai/node-cqrs-domain - 但这是整个CQRS与事件采购实现.
我的想法是那样做:
//domain/book.js
function Book(title, author)
{
this._title = title;
this._author = author;
}
// domain methods ...
//infrastructure/persistance/repository/book-repository.js
function BookRepository()
{}
BookRepository.prototype.save(book)
{
var bookModel = mappers.mapToOrm(book);
return bookModel.save();
}
// [...] get, getAll, getNextId
//infrastructure/persistance/orm/book.js
//using http://bookshelfjs.org/
var Book = bookshelf.Model.extend({
tableName: 'books'
});
//infrastructure/mappers/book-mapper.js
function mapToOrm(book) {
//mapping [...]
return new persistance.Book();
}
function mapToDomain(domain) {
//mapping [...]
return new domain.Book();
}
Run Code Online (Sandbox Code Playgroud)
但另一方面,我从未见过任何类似的解决方案(使用域模型,orm模型,存储库和映射器).我是以正确的方式思考的吗?也许没有理由在node.js应用程序中分离域中的业务逻辑.如果是这样,为什么?如果没有,你能给我一个DDD实现的例子或改进我的代码吗?
[2017年1月13日]
我在TypeScript中创建了示例应用程序.目前没有存储库,没有太多服务.欢迎提出问题和拉取请求. https://github.com/dawiddominiak/ddd-typescript-bin-packing-problem-solution
我想在我的实体中避免使用getter/setter地狱(这是原因:http://ocramius.github.io/doctrine-best-practices/#/53),但两个最受欢迎的管理面板生成器:
需要getter和setter来呈现视图.
我的想法是创建DTO对象(http://ocramius.github.io/doctrine-best-practices/#/57),然后使用命名构造函数来创建实体.我想在我的服务中调用命名构造函数.强制管理面板生成器使用我的DTO来持久保存/更新数据的最佳方法是什么?在这种情况下,您能给我一个想法和/或良好实践示例吗?
我想象的唯一方法是使用DTO而不是真实实体,调用prePersist/preUpdate挂钩并使用自定义服务,但它看起来很混乱.
我是Symfony 2和Doctrine的新手,有一个简单的问题:
我的存储库中有一个非常简单的代码:
<?php
namespace BakeryIT\BakeryBundle\Entity;
use Doctrine\ORM\EntityRepository;
class ProjectRepository extends EntityRepository
{
public function findHistory(){
return $this->getEntityManager()
->createQueryBuilder()
->select('p')
->from('Project','p')
->getQuery()
->getResult();
}
}
Run Code Online (Sandbox Code Playgroud)
我的控制器中有两个简单的功能:
<?php
namespace BakeryIT\BakeryBundle\Controller;
/*
...
*/
class ProjectController extends Controller
{
public function indexAction()
{
return $this->index('Project', 'findHistory');
}
}
Run Code Online (Sandbox Code Playgroud)
控制器看起来像这样:
public function index($entity, $query = 'findAll')
{
$repository = $this->getDoctrine()
->getRepository('BakeryBundle:'.$entity);
$data = $repository->$query();
return $this->render('BakeryBundle:'.$entity.':index.html.twig',
array('data' => $data));
}
Run Code Online (Sandbox Code Playgroud)
这段代码告诉我在"Project p"附近的语义错误[Semantical Error]第0行第14行:错误:未定义类'Project'.
另一方面,如果我在我的存储库中更改此行,一切都很完美:
->from('Project','p')
Run Code Online (Sandbox Code Playgroud)
至
->from('BakeryIT\BakeryBundle\Entity\Project','p')
Run Code Online (Sandbox Code Playgroud)
我不知道为什么这个例子在第一种情况下不起作用.我的BakeryIT\BakeryBundle\Entity\Project中的命名空间以这种方式设置:
namespace BakeryIT\BakeryBundle\Entity; …Run Code Online (Sandbox Code Playgroud)