隨着Spring4d,你可以像這樣Spring4d:擁有Owner:TComponent參數的自動工廠?
aContainer.RegisterInstance<TFunc<string, TMyObject>>(function(aName : string):TMyObject
begin
Result := TMyObject.Create(aName);
end);
以這種方式註冊自定義的工廠,我會beleive,對於每一個從TComponent
,一個誰願意通過業主要麼做繼承依賴
// Registrations
aContainer.RegisterInstance<TFunc<TComponent, TMyObject>>(function(Owner : TComponent):TMyObject
begin
Result := TMyObject.Create(Owner);
end);
// Then in code
constructor TMyClass.Create(aFctry : TFunc<TComponent, TMyObject>);
begin
fObj := aFctry(Self);
end;
或者一個還可以做
aContainer.RegisterType<TMyObject, TMyObject>;
// In code
constructor TMyClass.Create(aObj : TMyObject);
begin
fObj := aObj;
InsertComponent(aObj);
end;
雖然,這是很容易出錯/添加代碼菊st通過主人。有沒有一種內置的方式來獲得一個以TComponent作爲參數的工廠,而無需事先在容器中註冊它?
因爲通常我會用
constructor MyObject.Create(aDep : TFunc<TMyDep>);
沒有註冊TFunc<TMyDep>
依賴,但只有TMyDep
類型。
它有可能通過類似
constructor MyObject.Create(aDep : TFunc<TComponent, TMyDep>);
而不必在容器註冊了嗎?
謝謝你們,但更我讀的答案,更多的我問自己,如果生命週期管理(所有權這種情況下)應該注射? – Ludo
@Ludo我們無法瞭解您正在實施的是什麼,所以無法爲您提供有關終身管理的建議。在Delphi中有很多可能性:只通過接口引用訪問你的對象,如果refcount爲零則銷燬它,或者創建層次結構,所有者負責創建和銷燬其組件,或者使其像VCL中那樣,表單擁有所有組件,或者在某些地方有手動內存管理。沒有通用的解決方案。 –