有没有办法在C#中获取捕获组的名称?
string line = "No.123456789 04/09/2009 999";
Regex regex = new Regex(@"(?<number>[\d]{9}) (?<date>[\d]{2}/[\d]{2}/[\d]{4}) (?<code>.*)");
GroupCollection groups = regex.Match(line).Groups;
foreach (Group group in groups)
{
Console.WriteLine("Group: {0}, Value: {1}", ???, group.Value);
}
Run Code Online (Sandbox Code Playgroud)
我想得到这个结果:
Group: [I don´t know what should go here], Value: 123456789 04/09/2009 999 Group: number, Value: 123456789 Group: date, Value: 04/09/2009 Group: code, Value: 999
我们的应用程序使用多种方式来授权访问给定资源.虽然它有效,但它很混乱......好吧,它似乎不对.
我们有明确定义的角色,每个角色都可以访问一组资源,不同的角色可以访问相同的资源.
截至目前,资源只是在数据库表中映射的MVC动作module,controller和action.
这似乎没问题,但每次我需要添加一个新的控制器/动作时,我必须将此资源映射到数据库表.
除了基于角色的授权之外,用户还可以或多或少地访问另一个角色的资源子集.例如.:
RoleA:资源一个,b,c ^,d
RoleB:资源X,ÿ,ž
ROLEC:资源1,2,3
用户1:具有RoleA但需要访问资源ÿ
用户2:具有RoleB和ROLEC但不具有访问资源ž
这被实现为一个user_resources表,其中包含用户有权访问或被拒绝的其他资源的条目(由标志指示).
我可以通过定制访问创建不同的角色,将角色视为一组权限,但这会导致角色爆炸.
如果这还不够,某些操作只能在模型处于某种状态时执行(每个模型都知道什么时候可以完成).例如:只有当用户有权访问编辑资源(通过步骤#1或#2)并且Order可以编辑对象时,才能编辑订单.
Anoter示例:用户可以访问a,Customer如果他有权访问/customer/view资源,并且他拥有该客户(他是该客户的联系信息).
角色,角色组或个人用户可以根据其状态查看有关模型的更多或更少信息.
如何在不放弃授予或限制资源访问权限的情况下简化此授权过程?
我在这里缺少任何模式来统一所有这些授权在一个地方?
问题的标题重新开始:我在哪里验证命令的授权?
例如,将客户设置为首选包括:
MarkAsPreferred 控制器动作(可以是Winforms或其他);SetCustomerAsPreferredCommand;SetCustomerAsPreferredCommandHandler;Customer.MarkAsPreferred() (域);我确定了3个地方来检查授权:
SomeView.cshtml
if (authorizationService.Authorize("MarkCustomerAsPreferred))
{
// show link
}
Run Code Online (Sandbox Code Playgroud)
CustomerController
[HttpPost]
public ActionResult MarkAsPreferred(Guid id)
{
if (!authorizationService.Authorize("MarkCustomerAsPreferred))
{
return RedirectToAction("Unauthorized");
}
var MarkCustomerAsPreferredCommand { Id = id };
...
}
Run Code Online (Sandbox Code Playgroud)
MarkCustomerAsPreferredCommandHandler
public void Handle(MarkCustomerAsPreferredCommand command)
{
if (!authorizationService.Authorize("MarkCustomerAsPreferred"))
{
throw new Exception("...");
}
customer.MarkAsPreferred();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:我是否需要在3个地方验证授权,或者我只是过度热心?
我搜索了整个互联网,但没有找到任何关于此的例子或参考.
编辑
经过更多研究和一些测试后,我认为包装命令以添加行为(授权,验证,日志记录),正如Dennis Taub所建议的那样,实施起来更容易,更清晰.
我发现这篇博文正好解释了这个概念.
关于为一个命令设置多个处理程序,我不需要为每个原始命令的每个行为实现一个命令处理程序,一个包装命令可以包装所有处理程序.
我开始(至少尝试)使用TDD原理进行编码,我有一个问题:在实际开始编码之前我需要编写多少测试?
以假设的Math类和方法为例Divide(int a, int b).
a)在开始编码之前,我是否必须完全测试所有Math类(,...)的方法?SumAverageMath
b)Divide在开始编码方法之前,我是否必须完全测试该方法,例如断言为零除以?
c)或者我可以创建一个简单的测试断言并验证它是否失败,编写代码并检查它是否正常,为每个方法的断言重新处理过程?
我认为选项c)是正确的,但我找不到答案(我做了一些搜索,但找不到确定的答案).
我试图测试是否在公共接口中调用受保护的方法.
<?php
abstract class SomeClassAbstract
{
abstract public foo();
public function doStuff()
{
$this->_protectedMethod();
}
protected function _protectedMethod();
{
// implementation is irrelevant
}
}
<?php
class MyTest extends PHPUnit_Framework_TestCase
{
public function testCalled()
{
$mock = $this->getMockForAbstractClass('SomeClass');
$mock->expects($this->once())
->method('_protectedMethod');
$mock->doStuff();
}
}
Run Code Online (Sandbox Code Playgroud)
我知道它被正确调用,但PHPUnit说它从未调用过.
当我测试另一种方式时,从未调用方法时会发生同样的情况:
<?php
abstract class AnotherClassAbstract
{
abstract public foo();
public function doAnotherStuff()
{
$this->_loadCache();
}
protected function _loadCache();
{
// implementation is irrelevant
}
}
<?php
class MyTest extends PHPUnit_Framework_TestCase
{
public function testCalled() …Run Code Online (Sandbox Code Playgroud) 我在Python中读取一个文件,其中每个记录由一个空的新行分隔.如果文件以两个或多个新行结束,则按预期处理最后一个记录,但如果文件以单个新行结尾,则不处理.这是代码:
def fread():
record = False
for line in open('somefile.txt'):
if line.startswith('Record'):
record = True
d = SomeObject()
# do some processing with line
d.process(line)
if not line.strip() and record:
yield d
record = False
for record in fread():
print(record)
Run Code Online (Sandbox Code Playgroud)
在这个数据样本中,一切都按预期工作('---'是一个空行):
记录1
数据a
数据b
数据c
\n
记录2
数据a
数据b
数据c
\n
\n
但在此,最后的记录没有返回:
记录1
数据a
数据b
数据c
\n
记录2
数据a
数据b
数据c
\n
如何保留文件中的最后一个新行以获取最后一条记录?
PS.:我使用术语"保留",因为我找不到更好的名字.
谢谢.
编辑 原始代码是一个剥离版本,只是为了说明问题,但似乎我剥离了太多.现在我发布了所有功能代码.
更多解释:SomeObject为文件中的每个记录创建对象,并且记录由空的新行分隔.在记录结束时,它会返回对象以便我可以使用它(保存到数据库,与其他对象进行比较等).
当文件以单个新行结束时的主要问题是,最后一条记录没有产生.似乎Python在空白时不会读取最后一行.