我读到了DDD和访问控制,我发现以下两种观点之间存在一些矛盾:
我正在寻找关于此的最佳实践.那么我应该在哪里通过域驱动设计放置访问控制逻辑,我应该如何实现它?
(更具体地说,DDD + CQRS + ES.)
我认为它应该接近业务逻辑,例如用户故事可能是这样的:
用户可以通过发送用户名,爱好列表,简历等来编辑他的个人资料...
根据用户故事,我们实现了域模型和服务,例如:
UserService
editProfile(EditUserProfileCommand command)
User user = userRepository.getOneById(command.id)
user.changeName(command.name)
user.changeHobbies(command.hobbies)
user.changeCV(command.cv)
UserRepository
User getOneById(id)
User
changeName(String name)
changeHobbies(String[] hobbies)
changeCV(String cv)
Run Code Online (Sandbox Code Playgroud)
这没关系,但HIS profile故事的一部分在哪里?
这显然是基于属性的访问控制,因为我们应该写一个这样的规则:
deny all, but if subject.id = resource.owner.id then grant access
Run Code Online (Sandbox Code Playgroud)
但是我们应该在哪里执行这条规则,我们应该如何实施呢?
是否可以使用禁用的构造函数和手动设置的受保护属性创建模拟对象?
这是一个愚蠢的例子:
class A {
protected $p;
public function __construct(){
$this->p = 1;
}
public function blah(){
if ($this->p == 2)
throw Exception();
}
}
class ATest extend bla_TestCase {
/**
@expectedException Exception
*/
public function testBlahShouldThrowExceptionBy2PValue(){
$mockA = $this->getMockBuilder('A')
->disableOriginalConstructor()
->getMock();
$mockA->p=2; //this won't work because p is protected, how to inject the p value?
$mockA->blah();
}
}
Run Code Online (Sandbox Code Playgroud)
所以我想注入受保护的p值,所以我不能.我应该定义setter或IoC,还是我可以用phpunit来做这个?
我知道Karma是一个JavaScript测试运行器,它可以在真正的浏览器中运行测试.如果是这种情况,Selenium会提供什么样的测试覆盖范围以及Karma.
javascript selenium browser-automation functional-testing karma-runner
我运行我的测试脚本npm run test并添加{script: {test: "jasmine"}}到package.json.我的问题是,每次运行测试时,npm都会生成一个npm-debug.log我不需要的文件.有没有办法关闭此功能?
注意:
我npm run只会在http://travis-ci.org/上运行测试,如果无法关闭此功能,它是否会通过测试构建在travis服务器上生成日志文件,或者是什么?
新闻2016:
该主题有新闻.至少5年后,npm调试日志被移动到缓存文件夹:https://github.com/npm/npm/issues/1548,因此它不再污染我们的项目文件夹.
创建临时表的最佳方法是什么(如果它尚不存在),并将所选行添加到其中?
我想知道域事件应该是多么精细?
例如,我有一些简单的事情,比如更改个人资料页面上的firstName,secondName和电子邮件地址.我应该有3个不同的域事件还是只有一个?
通过粗粒度域事件,当我添加新功能时,我必须创建一个新版本的事件,所以我必须添加一个新的事件类型,或在事件存储中存储事件版本.通过细粒度的域事件我没有这些问题,但我有太多的小类.您怎么看?在这种情况下,最佳做法是什么?
我有一个小型仓库,有一个主人和一个实验分支,用于尝试一些新功能.我决定不在master上实现这些功能.
当我删除该分支时,实验分支的提交会发生什么git push origin --delete <branchName>?git会保留一些不可访问的残余物吗?如果我记得很清楚,我在该分支上有标签,并将其上传到github.这会导致任何问题吗?
编辑:
我gitk --all按照建议检查,提交图如下所示:
我想删除所有提交的babel分支,我不希望它可以恢复.这可能吗?
我不想读几个小时的代码来找到相关的部分,但我很好奇茉莉如何实现它的时钟.有趣的是它可以使用同步测试代码测试异步代码.AFAIK与当前node.js一起支持ES5,这是不可能的(异步函数在ES7中定义).它是用estraverse解析js代码并从同步测试中构建异步测试吗?
只是我所说的一个例子:
it("can test async code with sync testing code", function () {
jasmine.clock().install();
var i = 0;
var asyncIncrease = function () {
setTimeout(function () {
++i;
}, 1);
};
expect(i).toBe(0);
asyncIncrease();
expect(i).toBe(0);
jasmine.clock().tick(2);
expect(i).toBe(1);
jasmine.clock().uninstall();
});
Run Code Online (Sandbox Code Playgroud)
在这里expect(i).toBe(1);应该是一个回调.
在我们的办公室里,我们有一个问题,就像这样.为了保持一致性,我将此上下文限制为python.我确定还有其他答案,但我真的只对python答案感兴趣.
say当我这样调用时,给我写一个名为的函数:
>>> say('Hello')('World')
Run Code Online (Sandbox Code Playgroud)
它只打印(不返回):
>>> say('Hello')('World')
Hello World
>>>
Run Code Online (Sandbox Code Playgroud)
我们在今天的采访之后进行了一次元讨论,我说我总是希望申请人能够回答以下问题.
def say(x):
print "Hello World"
return lambda a:None
Run Code Online (Sandbox Code Playgroud)
我意识到有可能通过用lambda某种类型的内置替换函数来进一步缩短它,None但是我已经挖了但似乎找不到比lambda a:None
所以这里的整体问题是......
你能想出一种方法来缩短它,因为总体角色较少(忽略换行符).任何导入语句都会计入您的字符数.(52个字符)
UPDATE
(39个字符)
>>> def p(x):
... print "Hello",x
>>> say=lambda x:p
>>> say("Hello")("World")
Hello World
>>>
Run Code Online (Sandbox Code Playgroud)
Python 3答案(48个字符)
>>> def say(x):
... return lambda a:print("Hello World")
>>> say("Hello")("World")
Hello World
>>>
Run Code Online (Sandbox Code Playgroud) 我有以下架构:
OFC.有端口和适配器,以及你能想象到的一切......
您有什么建议,如何通过即时一致性发送休息响应?我应该添加另一个事件总线并举办活动吗?(我猜投影必须发一些关于成功的事情.)
如何在这样的基于事件的系统中处理错误?(事件总线不是必需的,我可以解决与IoC容器的松散耦合,但我不认为通过这么多对象发送回调将是一个很好的解决方案.)
cqrs ×2
javascript ×2
architecture ×1
create-table ×1
ecmascript-7 ×1
event-store ×1
git ×1
github ×1
jasmine ×1
jasmine2.0 ×1
karma-runner ×1
logging ×1
npm ×1
php ×1
phpunit ×1
postgresql ×1
python ×1
rest ×1
security ×1
selenium ×1