1

我一直在尝试使用 mORMOt DDD 方式开始一个新项目,并创建了一些类并开始以简单/简单的方式测试其中一个。我使用了关于 TUser 的 DDD 示例中的回归测试代码,并对其进行了修改以适合我的班级。

我试图最小化代码,希望它可以包含一些线索,帮助我理解这里出了什么问题。我发现只使用服务器时,一切正常,但使用客户端时,ORMselection 找不到数据。我尽可能地精简了代码,并用一些注释标记了它在哪些地方可以工作,哪些地方不能工作。

class procedure TInfraRepoPackageFactory.RegressionTestsPackage(test: TSynTestCase);
procedure TestOne(Rest: TSQLRest);
var cmd: IDomPackageCommand;
    qry: IDomPackageQuery;
    package: TPackage;
begin
  test.Check(Rest.Services.Resolve(IDomPackageCommand,cmd));
  package := TPackage.Create;
  try
      package.articleNo := 10000;
      test.check(cmd.Add(package)=cqrsSuccess);
    end;
    test.check(cmd.Commit=cqrsSuccess);
  finally
    package.Free;
  end;
  package := TPackage.Create;
  try
    test.Check(Rest.Services.Resolve(IDompackageQuery,qry));
      test.Check(qry.SelectByArticleNo(10000,false)=cqrsSuccess);  // <<-- Debugging shows that it will not find anything when using client.
      test.Check(qry.GetCount=1);                                             // <<-- getCount returns zero when using client.
    end;
  finally
    package.Free;
  end;

end;

var RestServer: TSQLRestServerFullMemory;
    RestClient: TSQLRestClientURI;
begin
  RestServer := TSQLRestServerFullMemory.CreateWithOwnModel([TSQLRecordPackage]);
  try // first try directly on server side
    RestServer.ServiceContainer.InjectResolver([TInfraRepoPackageFactory.Create(RestServer)],true);
    TestOne(RestServer); // sub function will ensure that all I*Command are released    // <<=== Works
  finally
    RestServer.Free;
  end;
  RestServer := TSQLRestServerFullMemory.CreateWithOwnModel([TSQLRecordPackage]);
  try // then try from a client-server process
    RestServer.ServiceContainer.InjectResolver([TInfraRepoPackageFactory.Create(RestServer)],true);
    RestServer.ServiceDefine(TInfraRepoPackage,[IDomPackageCommand,IDomPackageQuery],sicClientDriven);
    test.Check(RestServer.ExportServer);
    RestClient := TSQLRestClientURIDll.Create(TSQLModel.Create([TSQLRecordPackage]),@URIRequest);
    try
      RestClient.Model.Owner := RestClient;
      RestClient.ServiceDefine([IDomPackageCommand],sicClientDriven);
      TestOne(RestServer);                                                             // <<=== Works
      RestServer.DropDatabase;
      USEFASTMM4ALLOC := true; // for slightly faster process
      TestOne(RestClient);                                                             // <<=== DO NOT Work !!!!
    finally
      RestClient.Free;
    end;
  finally
    RestServer.Free;
  end;
end;

我也尝试将这个问题放在 mORMot 论坛上,但邮件无法到达该站点。收到此消息:

遇到错误错误:无法发送电子邮件。请联系论坛管理员,SMTP 服务器报错如下:“450 4.1.2: Recipient address denied: Domain not found”。

4

1 回答 1

0

我终于找到了问题所在。在聚合类 TPackage 中,我将 packageNo 的属性设置为“存储的 AS_UNIQUE”——这导致提交只在该字段中存储了零,然后 SELECT('packageNo=?,[10001]) 找不到任何事物。我没有意识到这一点,因为包对象只包含 10001 并且永远不会想到提交应该存储 0 的可能性。但是当我使用 TSQLHttpServer 和 TSQLHttpClient 以及一个真实的数据库进行测试时,我可以看到 packageNo 中所有包含零的记录场地。然后我明白了,一定是这个领域出了问题。当我查找 TPackage 时,我发现了我的错误。我应该在 TSQLRecordPackage 类中设置“STORED AS_UNIQUE”,而不是 ORM 使用的那个。

故事的寓意……“睁开眼睛……你就会看到”;-)

于 2019-08-01T09:26:31.407 回答