我們使用來自 Spring4D 的依賴注入框架,如果它無法決議所有建構式引數,則它構造物件的方式存在問題。在我們的例子中,祖先的建構式的所有引數都可以被決議,看起來 Spring4D 現在使用這個建構式。即使我們reintroduce將建構式作為后代,它仍然使用祖先的建構式。
但是,我期望(并且更喜歡)的行為是,如果它無法為您嘗試決議的介面找到正確的建構式,則決議失敗。
例子:
TMyClass = class(TInterfacedObject, IMyClass)
constructor Create(ARequester: IRequester);
end;
TMyDescendant = class(TMyClass, IMyDescendant)
constructor Create(ARequester: IRequester; AnotherRequester: IOtherRequester);
end;
GlobalContainer.Resolve<IMyDescendant>
TMyClass在這個例子中,如果沒有注冊的類實作,它將呼叫建構式IOtherRequester。這意味著建構式中的任何Guard.IsNotNull內容都TMyDescendant不起作用,因為該建構式永遠不會被呼叫。
有沒有辦法解決這個問題?當然我們可以重寫TMyClassin的建構式TMyDescendant,但我更喜歡更干凈的方式來做到這一點。
uj5u.com熱心網友回復:
這個問題有多種解決方案。
單元中有一個容器擴展
Spring.Container.ActivatorExtension。您只需像這樣注冊它:GlobalContainer.AddExtension<TActivatorContainerExtension>;這將整個容器的建構式發現的行為更改為僅考慮具有任何建構式的最派生類的建構式,從而避免在
TObject.Create缺少任何依賴項時回傳。請記住,即使您可以在兩個引數建構式上撰寫多載并且沒有注冊
IOtherRequester它也不會轉到TMyClass它可以滿足的建構式,因為您注冊了 someIRequester。這是因為 RTTI 不包含任何有關多載的資訊,即使這意味著容器必須實作可能變得相當復雜的多載解決方案。使用注釋您的建構式
[Inject](請記住將單元添加Spring.Container.Common到使用中,否則它將沒有任何效果 - 取決于編譯器版本,您將看到 W1074 警告)這將強制容器只考慮這個 ctor 而忽略任何其他。事實上,你可以用它來注釋兩個建構式——它總是會首先找到最派生的一個。如果您要繼承其他
TMyClass不引入自己的建構式的類,那么它將強制TMyClass使用該類。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/451205.html
上一篇:為什么DelphiTOpenDialog無法在初始目錄中打開?
下一篇:與C 中的“版本控制”同步
