gpt4 book ai didi

delphi - 关于创建类结构的想法

转载 作者:行者123 更新时间:2023-12-01 16:11:11 25 4
gpt4 key购买 nike

我有一个使用多个类和组件开发的框架。我想创建一个可以访问整个框架的主对象,以便所有开发人员都可以从一个位置访问这些方法。

示例:

MyApp.Framework.DataBase
MyApp.Framework.DateUtils
MyApp.Framework.Users
MyApp.Framework.System

对象MyApp映射整个框架,所有开发人员都可以随时完全访问。

主要问题是创建一个健壮且易于扩展的结构。过一段时间我会包括我们公司产品的功能和方法的结构。

示例:

MyApp.Blog.    (functions about Blog product)
MyApp.WebDocs. (functions WebDocs product)

有关类的更多示例:

TMyAppBase = Class
Private
Function GetDatabase: TDataBaseClass;
Function GetUsers: TSystemUsersClass;
Function GetForms: TFormManager;
Public
Constructor Create; Virtual;
Destructor Destroy; Override;
Property Database: TDataBaseClass Read GetDatabase;
Property Users: TSystemUsersClass Read GetUsuarios;
Property Forms: TFormManager Read GetForms;
End;

使用此类:

var
LMyApp: TMyAppBase

begin
ShowMessage(LMyApp.Users.ActiveUserName);
end;

那是 friend 吗,如果可能的话,我想听听你的想法。我的目的是创建一个单一且可扩展​​的结构。

最佳答案

正如我在评论中所写的,我认为在这种情况下,使用一个主要的服务(主类,单例)是一个好主意,它可以为您提供对其他服务的访问。您的所有模块都有唯一的 ID (TGUID)。在程序执行开始时,它们应该在主服务中注册自己。
例如。主要服务单位:

unit AppServices;

interface
uses generics.collections, rtti;
type
// Unique ID Attribute for services
ServiceIDAttribute = class(TCustomAttribute)
strict private
FId : TGUID;
public
constructor Create(ServiceID: string);
property ID : TGUID read FId;
end;

//Services Base class
TCustomAppService = class(TObject)
strict protected
public
end;

// Main Service Object
TAppServices = class(TObject)
strict private
class var
FServices : TObjectDictionary<TGUID, TCustomAppService>;
var
public
class constructor Create();
class destructor Destroy();
class procedure RegisterService(aService : TCustomAppService);
class function QueryService(ServiceID : TGUID):TCustomAppService;
end;

这里的类构造函数析构函数只是创建并释放FServices字典。 QueryService 方法通过其唯一 ID 返回服务:

class function TAppServices.QueryService(ServiceID: TGUID): TCustomAppService;
begin
result := nil;
if FServices.ContainsKey(ServiceID) then
result := FServices[ServiceID];
end;

方法RegisterService从参数的类名中提取RTTI属性(ServciceIDAttribute)并将该对(id-service)添加到字典中:

class procedure TAppServices.RegisterService(aService: TCustomAppService);
var ctx : TRttiContext;
st : TRttiType;
a : TCustomAttribute;
id : TGUID;
begin
ctx := TRttiContext.Create();
try
st := ctx.GetType(aService.ClassType);
for a in st.GetAttributes() do begin
if not (a is ServiceIDAttribute) then
continue;
id := ServiceIDAttribute(a).ID;

FServices.AddOrSetValue(id, aService);
break;
end;
finally
ctx.Free();
end;
end;

现在,关于终端服务。例如UserManager单元:

unit UserManager;

interface
uses AppServices;

const
SID_UserManager : TGUID = '{D94C9E3A-E645-4749-AB15-02631F21EC4E}';
type
[ServiceID('{D94C9E3A-E645-4749-AB15-02631F21EC4E}')]
TUserManager = class(TCustomAppService)
strict private
FActiveUserName: string;
public
property ActiveUserName: string read FActiveUserName;
end;


implementation


initialization
TAppServices.RegisterService(TUserManager.Create());
end.

现在我们可以测试我们的代码:

procedure TestApp();
var uMgr :TUserManager;
dbMgr : TDBmanager;
begin
dbMgr := TAppServices.QueryService(SID_DBManager) as TDBManager;
if dbMgr.Connected then
writeln('connected!')
else writeln('not connected');

uMgr := TAppServices.QueryService(SID_UserManager) as TUserManager;
writeln('Active user: ', uMgr.ActiveUserName);
end;

摘要:
TAppServices 是主要对象,它提供对 App 中任何服务的访问。它对终端服务一无所知,因此没有依赖性。您可以根据需要更改其实现。您可以根据需要拥有任意多个 TCustomAppService 类后代。当您向应用程序添加新服务时,不应更改 TAppServices 类接口(interface)或实现。

关于delphi - 关于创建类结构的想法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13494009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com