我有默認DI實現的Asp.net Core項目。 因此,我通過DI獲取BL服務實例,存儲庫和EF上下文。 我有抽象方法返回某些類型的參數。如何將抽象方法重構爲DI
IDocumentPreprocessor CreateDocumentPreprocessor(DocType docType)
{
switch (docType)
{
case DocType.Txt:
return new TxtPreprocessor(_context, _docRepository);
case DocType.Doc:
return new DocPreprocessor(_docRepository);
default:
throw new ...
}
}
我不喜歡這裏用「新」直接創建實例。 但我不確定是否有可能將此邏輯傳遞給DI。 所以這個問題 - 如何將其重構爲DI使用?
你可以用工廠類封裝這個函數如果OP想要一個新的DocType,比如DocType.Pdf, 'DocumentPreprocessorFactory'類中不需要更改嗎?儘管添加新類型是一個相當簡單的更改,但它是否違反了Open Closed原則來更改「DocumentPreprocessorFactory」類以包含用於添加Pdf功能的新邏輯?如果OP最終需要'DocType.Xml'等,那麼也一樣? – 2017-10-16 12:59:59
@邁克 - 毛瑞爾,你說的沒錯。但是,重構OP的'switch'塊是開放式的,這是完全不同的故事。 –
有趣。我很想知道是否有一個解決這個問題而不違反SOLID原則的實現。 – 2017-10-16 13:58:04