delphi 如何使用kbmMWConfiguration,仅将配置用作内存

unftdfkk  于 2022-11-29  发布在  其他
关注(0)|答案(1)|浏览(142)

我知道,我可以使用Configuration对象创建文件:

// Config.PrepareYAMLStorage;
// Config.PrepareBSONStorage;
// Config.PrepareJSONStorage;
   Config.PrepareXMLStorage;

这些文件是在对象被销毁时自动创建的。我想只将该类用作内存,这样我就可以在数据库上持久化Config.Storage的内容。
有没有一个类似于Storage.asString的Storage变体,或者我如何创建一个替代现有Storage的变体,它可以做到这一点?

vdgimpew

vdgimpew1#

有几种方法。
“预期”方式是为配置对象创建您自己的存储方法。
如果希望数据为JSON,可以从TkbmMWJSONConfigurationStorage继承,并添加两个方法来提供包含JSON数据的字符串。
例如:

TMyStorage = class(TkbmMWJSONConfigurationStorage)
protected
   function GetConfigurationAsString:string;
   procedure SetConfigurationAsString(const AString:string);
public
   property ConfigurationAsString:string read GetConfigurationAsString write SetConfigurationAsString;
end;
...
function TMyStorage.GetConfigurationAsString:string;
var
  str:TkbmMWJSONStreamer;
begin
  str:=TkbmMWJSONStreamer.Create;
  try
     Result:=str.SaveToUTF16String(&ON);
  finally
     str.Free;
  end;
end;

procedure TMyStorage.SetConfigurationAsString(const AString:string);
var
  str:TkbmMWJSONStreamer;
  co:TkbmMWONCustomObject;
begin
  str:=TkbmMWJSONStreamer.Create;
  try
     co:=str.LoadFromUTF16String(AString);
     if co.IsObject then
     begin
          &ON.Free;
          &ON:=TkbmMWONObject(co);
     end
     else
         co.Free;
  finally
     str.Free;
  end;
end;

然后

var
   myStorageInstance:TMyStorage;
begin
     myStorageInstance:= TMyStorage.Create('somepathtojsonstorage',false);
     Configuration.Storage:=myStorageInstance;
end;

请注意,这仍然会将配置保存到文件或从文件加载配置。如果您想防止这种情况,请覆盖Save和Load方法,使它们不执行任何操作。但它确实为您提供了一种以字符串形式访问JSON存储的方法。不过,它也防止您随意切换存储。因为通常不容易从字符串设置或读取完整的基于注册表的存储。
既然你希望你的存储在一个数据库中,另一种方法是创建一个特殊的存储,它能够将每一个设置存储到一个数据库中,并从数据库中检索它。这将是一种“最纯粹”的数据库驱动的配置存储方法。
但是,您必须在自己的TkbmMWCustomConfigurationStorage子代中覆盖这些方法:

protected
  function GetAsString(const APath:string):kbmMWNullable<string>; override;
  procedure SetAsString(const APath:string; const AValue:kbmMWNullable<string>); override;
  function GetAsInt32(const APath:string):kbmMWNullable<integer>; override;
  procedure SetAsInt32(const APath:string; const AValue:kbmMWNullable<integer>); override;
  function GetAsInt64(const APath:string):kbmMWNullable<int64>; override;
  procedure SetAsInt64(const APath:string; const AValue:kbmMWNullable<int64>); override;
  function GetAsDouble(const APath:string):kbmMWNullable<double>; override;
  procedure SetAsDouble(const APath:string; const AValue:kbmMWNullable<double>); override;
  function GetAsBoolean(const APath:string):kbmMWNullable<boolean>; override;
  procedure SetAsBoolean(const APath:string; const AValue:kbmMWNullable<boolean>); override;
  function GetAsDateTime(const APath:string):TkbmMWDateTime; override;
  procedure SetAsDateTime(const APath:string; const AValue:TkbmMWDateTime); override;
  function GetAsBinary(const APath:string):kbmMWNullable<TkbmMWBytes>; override;
  procedure SetAsBinary(const APath:string; const AValue:kbmMWNullable<TkbmMWBytes>); override;

  function GetContains(const APath:string):boolean; override;
  function GetDelete(const APath:string):boolean; override;
public
  procedure Reset; override;

而且很可能

public
  function Load:boolean; override;
  function Save:boolean; override;

/金/C4D

相关问题