- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用多个类和组件开发的框架。我想创建一个可以访问整个框架的主对象,以便所有开发人员都可以从一个位置访问这些方法。
示例:
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/
我目前正在尝试基于哈希表构建字典。逻辑是:有一个名为 HashTable 的结构,其中包含以下内容: HashFunc HashFunc; PrintFunc PrintEntry; CompareF
如果我有一个指向结构/对象的指针,并且该结构/对象包含另外两个指向其他对象的指针,并且我想删除“包含这两个指针的对象而不破坏它所持有的指针”——我该怎么做这样做吗? 指向对象 A 的指针(包含指向对象
像这样的代码 package main import "fmt" type Hello struct { ID int Raw string } type World []*Hell
我有一个采用以下格式的 CSV: Module, Topic, Sub-topic 它需要能够导入到具有以下格式的 MySQL 数据库中: CREATE TABLE `modules` ( `id
通常我使用类似的东西 copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData)); copy((uint8_t*)&PODV
错误 : 联合只能在具有兼容列类型的表上执行。 结构(层:字符串,skyward_number:字符串,skyward_points:字符串)<> 结构(skyward_number:字符串,层:字符
我有一个指向结构的指针数组,我正在尝试使用它们进行 while 循环。我对如何准确初始化它并不完全有信心,但我一直这样做: Entry *newEntry = malloc(sizeof(Entry)
我正在学习 C,我的问题可能很愚蠢,但我很困惑。在这样的函数中: int afunction(somevariables) { if (someconditions)
我现在正在做一项编程作业,我并没有真正完全掌握链接,因为我们还没有涉及它。但是我觉得我需要它来做我想做的事情,因为数组还不够 我创建了一个结构,如下 struct node { float coef;
给定以下代码片段: #include #include #define MAX_SIZE 15 typedef struct{ int touchdowns; int intercepti
struct contact list[3]; int checknullarray() { for(int x=0;x<10;x++) { if(strlen(con
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Empty “for” loop in Facebook ajax what does AJAX call
我刚刚在反射器中浏览了一个文件,并在结构构造函数中看到了这个: this = new Binder.SyntaxNodeOrToken(); 我以前从未见过该术语。有人能解释一下这个赋值在 C# 中的
我经常使用字符串常量,例如: DICT_KEY1 = 'DICT_KEY1' DICT_KEY2 = 'DICT_KEY2' ... 很多时候我不介意实际的文字是什么,只要它们是独一无二的并且对人类读
我是 C 的新手,我不明白为什么下面的代码不起作用: typedef struct{ uint8_t a; uint8_t* b; } test_struct; test_struct
您能否制作一个行为类似于内置类之一的结构,您可以在其中直接分配值而无需调用属性? 前任: RoundedDouble count; count = 5; 而不是使用 RoundedDouble cou
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
在创建嵌套列表时,我认为 R 具有对列表元素有用的命名结构。我有一个列表列表,并希望应用包含在任何列表中的每个向量的函数。 lapply这样做但随后剥离了列表的命名结构。我该怎么办 lapply嵌套列
我正在做一个用于学习目的的个人组织者,我从来没有使用过 XML,所以我不确定我的解决方案是否是最好的。这是我附带的 XML 文件的基本结构:
我是新来的 nosql概念,所以当我开始学习时 PouchDB ,我找到了这个转换表。我的困惑是,如何PouchDB如果可以说我有多个表,是否意味着我需要创建多个数据库?因为根据我在 pouchdb
我是一名优秀的程序员,十分优秀!