Tôi đã tạo ra một IoC trong delphi với khả năng tự động đăng ký bất kỳ lớp học có một IocSingletonAttribute cho nó.Tạo IoC Delphi. Làm thế nào để vô hiệu hóa liên kết Delphi của từ loại bỏ các lớp không sử dụng
AutoRegister trông giống như sau.
procedure TIocContainer.AutoRegister;
var
ctx: TRttiContext;
rType: TRttiType;
attr: TCustomAttribute;
&Type: PTypeInfo;
begin
ctx := TRttiContext.Create;
for rType in ctx.GetTypes do
Begin
for attr in rType.GetAttributes do
Begin
if TypeInfo(IocSingletonAttribute) = attr.ClassInfo then
Begin
&Type := IocSingletonAttribute(attr).&Type;
RegisterType(&Type, rType.Handle, True);
End;
End;
End;
end;
Sau đó, tôi tạo triển khai và thêm thuộc tính IocSingletonAttribute vào nó. Có vẻ như đây là
[IocSingleton(TypeInfo(IIocSingleton))]
TIocSingleton = class(TInterfacedObject, IIocSingleton)
procedure DoSomeWork;
end;
Vì vậy, bây giờ đến mã thực tế của chương trình. Nếu tôi viết mã dưới IoC không hoạt động. Thủ tục AutoRegister đã không nhận TIocSingleton.
var
Ioc: TIocContainer;
Singleton: IIocSingleton;
begin
Ioc := TIocContainer.Create;
try
Ioc.AutoRegister;
Singleton := Ioc.Resolve<IIocSingleton>();
Singleton.DoSomeWork;
finally
Ioc.Free;
end;
end.
Nhưng nếu tôi viết mã bên dưới thay vào đó mọi thứ hoạt động như mong đợi. Chú ý cách tôi đã khai báo lớp TIocSingleton và đã sử dụng nó như thế nào.
var
Ioc: TIocContainer;
Singleton: IIocSingleton;
ASingleton: TIocSingleton;
begin
Ioc := TIocContainer.Create;
ASingleton := TIocSingleton.Create;
try
Ioc.AutoRegister;
Singleton := Ioc.Resolve<IIocSingleton>();
Singleton.DoSomeWork;
finally
Singleton.Free;
Ioc.Free;
end;
end.
Vì vậy, trên cơ sở này, tôi giả Delphi của trình biên dịch liên kết là loại bỏ TIocSingleton trong ví dụ đầu tiên bởi vì nó không bao giờ được sử dụng một cách rõ ràng trong bất kỳ phần nào của ứng dụng. Vì vậy, câu hỏi của tôi là, có thể bật tính năng 'gỡ bỏ mã không sử dụng' của trình biên dịch cho một lớp nhất định không? Hoặc nếu vấn đề của tôi không phải là mối liên kết, bất cứ ai có thể làm sáng tỏ lý do tại sao ví dụ thứ hai hoạt động chứ không phải là ví dụ đầu tiên?
Tôi nghĩ rằng hy vọng duy nhất của bạn là bao gồm một số mã buộc trình liên kết đưa vào lớp học. Việc thêm khởi tạo TIoCSingleton.ClassName sẽ thực hiện. Có, bạn phải làm điều đó cho mọi lớp học bạn có thể đăng ký. Một khả năng khác có thể đang sử dụng các gói –
Cảm ơn bạn đã tìm mẹo. Gọi TIoCSingleton.ClassName dưới phần khởi tạo của đơn vị có thể không quá tệ để sống với – Coolio