C# 需要一个关于CodeContracts的建议吗

C# 需要一个关于CodeContracts的建议吗,c#,validation,code-contracts,C#,Validation,Code Contracts,嗨,伙计们 我是CC的新手,我需要你的建议。在我的上一个项目中,我从CC开始。我有一份WCF合同,应由第三方执行。我想将代码合同分配给服务合同。假设我有一辆普通车(服务合同),它是运营合同ICar。ICar有一个方法GetCar(),正如我前面所说的,应该由我们的客户机实现。我为Icar创建了一个代码契约类,在GetCar方法中,我使用CarContractHelper类验证契约。我引入了一个helper类,它通过以下方式验证Car类:Contract.sure(CarContractHelpe

嗨,伙计们 我是CC的新手,我需要你的建议。在我的上一个项目中,我从CC开始。我有一份WCF合同,应由第三方执行。我想将代码合同分配给服务合同。假设我有一辆普通车(服务合同),它是运营合同ICar。ICar有一个方法GetCar(),正如我前面所说的,应该由我们的客户机实现。我为Icar创建了一个代码契约类,在GetCar方法中,我使用CarContractHelper类验证契约。我引入了一个helper类,它通过以下方式验证Car类:
Contract.sure(CarContractHelper.Validate(Contract.Result())
。这是解决问题的正确方法吗?还是有更好的办法? 我还验证了它的setters中Car类的每个属性成员,您对此有何看法,这是必要的还是过火了? 谢谢 当然,我会记下正确答案并投票支持:)

更新


@StriplingWarrior我介绍了car验证助手来处理重复的合同验证代码。例如:

Contract.Requires(!string.IsNullOrWhiteSpace(car.Id);
Contract.Requires(car.Mileage > 0);
我没有编写everywhere契约。需要代码,我只是为每个业务对象提供了一个帮助器类,用于验证业务对象的契约。这就是我想知道的,如果这是一个正确的方法,或者有更好的方法? 谢谢


另外,我正在验证它们自己的setter中的每个属性,因为不变量方法对我不起作用(?),据我所知,不变量在调用类的任何方法时都起作用,在我的情况下,wcf合同没有任何方法。所以我选择验证内部属性setter。这是一个好方法吗?

我对代码契约做得不多,但这里有一些观察:

代码契约的优点之一是能够查看特定方法的契约,并知道所期望的内容。查看
CarContractHelper.Validate(Contract.Result())
并不能真正告诉我任何事情,因此我必须深入了解(例如)返回值的
CarId
大于零。因此,在某种程度上,我更希望看到
Contract.sure(Contract.Result().CarId>0)
,以及一些其他需求。另一方面,我可以看到,如果(例如)您向
Car
类添加了一个新属性,那么这将创建大量重复的合同代码,这将很难管理

代码契约的另一个潜在优势是能够对您的需求进行编译时检查。例如,考虑下面的代码:

var car = _carService.GetCar();
_crashTestUtil.TestCar(car);
如果TestCar的合同要求
car.CarId>0
,并且
GetCar()
未能确保情况属实,编译器可以警告您这一事实。为了让它与验证助手类一起工作,我认为您需要确保您的验证助手类也使用代码契约方法来执行契约检查


尽管您正在对Car类的属性设置器执行检查,但我认为在该方法返回之前验证所有必需的值是否已设置仍然是有意义的。

我对代码契约做的不多,但这里有一些观察:

代码契约的优点之一是能够查看特定方法的契约,并知道所期望的内容。查看
CarContractHelper.Validate(Contract.Result())
并不能真正告诉我任何事情,因此我必须深入了解(例如)返回值的
CarId
大于零。因此,在某种程度上,我更希望看到
Contract.sure(Contract.Result().CarId>0)
,以及一些其他需求。另一方面,我可以看到,如果(例如)您向
Car
类添加了一个新属性,那么这将创建大量重复的合同代码,这将很难管理

代码契约的另一个潜在优势是能够对您的需求进行编译时检查。例如,考虑下面的代码:

var car = _carService.GetCar();
_crashTestUtil.TestCar(car);
如果TestCar的合同要求
car.CarId>0
,并且
GetCar()
未能确保情况属实,编译器可以警告您这一事实。为了让它与验证助手类一起工作,我认为您需要确保您的验证助手类也使用代码契约方法来执行契约检查


即使您正在对Car类的属性设置器执行检查,我认为在该方法返回之前验证所有必需的值是否已设置仍然是有意义的。

尽管可以使用代码契约,但我个人不会这样使用它。我认为纯验证属于域层(如果您使用的是某种域驱动的方法),并且car应该能够在有或没有代码契约的情况下进行验证

在我看来,如果您的API处理了无效的汽车或抛出了适当的异常,那就更好了。如果你使用代码合同来检查汽车的有效性,你只有两个选择:1。这辆车是有效的。汽车无效,合同例外(或您自己的例外)


我支持代码合同,但更希望看到合同更详细。你一定要努力使不变量工作。另一种方法是在界面上定义契约。

尽管代码契约可以用于此,但我个人不会这样使用它。我认为纯验证属于域层(如果您使用的是某种域驱动的方法),并且car应该能够在有或没有代码契约的情况下进行验证

在我看来,如果您的API处理了无效的汽车或抛出了适当的异常,那就更好了。如果你使用代码合同来检查汽车的有效性,你只有两个选择:1。这辆车是有效的。汽车无效,合同例外(或您自己的例外)

我支持代码合同,但更愿意看到