如何使用NRules创建验证规则?

时间:2015-09-13 20:26:24

标签: nrules

我刚刚发现了针对.NET的NRules。如果字段/属性值无效,我想创建一个阻止对象构造的规则。例如,给定以下类:

#import "AppDelegate.h"

#import "RCTRootView.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  NSURL *jsCodeLocation;


  jsCodeLocation = [NSURL    URLWithString:@"http://localhost:8080/index.ios.bundle"];

  RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
  moduleName:@"amapp"
  launchOptions:launchOptions];

  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  UIViewController *rootViewController = [[UIViewController alloc] init];
  rootViewController.view = rootView;
  self.window.rootViewController = rootViewController;
  [self.window makeKeyAndVisible];
  return YES;
}

@end

我希望创建一个规则,当' Name'为null或为空,因此,取消对象创建,以及生成用户定义的消息:必须指定客户名称。

这可以用NRules完成,如果是这样,它是如何完成的?

1 个答案:

答案 0 :(得分:2)

使用NRules,您可以根据特定域或对象模型编写规则。因此,您需要一些对象来保存数据,以便您可以将这些对象插入到规则会话中,并且还可以将这些对象与规则进行匹配。 我想,对于验证方案,您将使用以下方法之一:

  • 来自服务层的DTO
  • 来自表示层的ViewModel对象
  • Builder对象在调用其Build方法(即CustomerBuilder)之前
  • 域对象本身(构建它,然后验证并丢弃,如果无效)

在更高层次上,NRules的最佳位置是在稳定的域模型方面表达不稳定的业务逻辑。在这种情况下,您可以将验证逻辑分为两组 - 1)稳定的验证并定义域对象的内在不变量,即客户名称不为空; 2)易失性验证逻辑(即,如果满足某些条件,则客户是首选)。然后,您可以将类型1的验证逻辑编码为域模型本身中的断言,并将类型2的验证逻辑编码为这些域对象的规则。

无论哪种方式,在机械级别,您可能希望验证规则为每个失败的验证插入ValidationError,然后在最后查询会话中查找这些验证错误并防止对象构造(如果有)。

ObjectUnderValidation match = null;

When()
  .Match<ObjectUnderValidation>(() => match, x => x.ValidationCondition);

Then()
  .Do(ctx => ctx.Insert(new ValidationError(match, "Message")));

稍后进行验证时:

var session = factory.CreateSession();
session.Insert(myObjectUnderValidation);

session.Fire();
var errors = session.Query<ValidationError>().ToList();

if (errors.Any())
  //Don't construct
else
  //Construct

您还可以在此处抽象一些样板代码,以便在特定情况下更容易使用。