[英]It's correct to have 2 constructors, one for Dependency Injection and the other one Resolving the injection?
我班上有2個構造函數:
public class VuelingCacheWebServices : IVuelingCacheWebService
{
public IVuelingCache apiConnector { get; set; }
public VuelingCacheWebServices(IVuelingCache ApiConnector)
{
apiConnector = ApiConnector;
}
public VuelingCacheWebServices()
: this(new VuelingCache())
{ }
}
如您所見,我有一個構造函數,具體取決於IVuelingCache和一個默認構造函數,它創建一個傳遞給第一個構造函數的實例。 這是對的嗎? 通過這種方式我擺脫了Factory類。
關於這種模式是一個好主意,存在一些爭論:
http://lostechies.com/chadmyers/2009/07/14/just-say-no-to-poor-man-s-dependency-injection/
在我看來,如果你有一個不是邏輯上的外部依賴的良好默認值 ,那么你應該提供該默認值。 如果您的“默認”確實不應該是默認值,或者會過於強烈地將彼此相距太遠的部分聯系起來,那么請不要使用該模式。
你通過這樣做來結合你的代碼,所以真的要長時間地考慮它是否會被用作本地可用的默認實現的便利默認值,或者如果你真的只是將它用作拐杖,並導致不適當的強耦合依賴。
此外,許多人提倡僅對所需的依賴項使用構造函數注入,並對可選的依賴項使用屬性注入。 當你使用窮人的DI模式時,你會產生一個可選(或默認)的依賴。 您可能需要考慮對這些可選依賴性情況使用屬性注入,因為這是許多人期望的模式。
不,這不是一個好主意,因為你的班級將成為有關IVuelingCache
( new VuelingCache()
)實現的知識。
您的方法存在一些問題:
ICommandHandler<T>
接口作為抽象來執行業務命令,並且你的類依賴於ICommandHandler<UpdateUserCommand>
並指向具體的UpdateUserCommandHandler
。 當你以后想要在DurationLoggingCommandHandler<T>
,DeadLockRetryCommandHandler`中包裝任何ICommandHandler<T>
,你需要通過你的完整應用程序來替換所有依賴項,否則它只需要重新配置配置應用程序的啟動路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.