2013-05-20 60 views
0

如果您有多個工廠實現,那麼每個實例需要使用不同的狀態信息來創建新對象時,會使用哪種模式?處理工廠實現中的狀態

實施例: IModelParameters:包含所有的輸入和輸出到一個複雜的計算 IModelParameterFactory:具有用於獲取和保存IModelParameter對象的方法。

問題是,一個工廠的實現可能是從數據庫獲取你的參數,需要一些檢索所需的狀態(例如UserID),另一個可能是從文件獲取輸入,在這種情況下你不需要有一個用戶名,但你確實需要一個文件名。

在這種情況下是否有另一種模式更好?我看了一些依賴注入工具/庫,並沒有看到任何似乎解決這種情況的東西。

回答

0

你有沒有試過把課程要求放在課堂上?

每個工廠實現都有其自己的requeriments,但所有的requeiments類派生形成一個基本的requeiment類(或阻礙一個requeriments接口)。這允許您爲所有工廠實現具有相同的接口,您只需在每個工廠實現中對正確的requeriments類執行轉換。

是的,轉換是醜陋的和容易出錯的,但是這種方法爲工廠提供了一個統一的可擴展接口。

0

很難說沒有看到一些代碼,但你可能想要考慮實施一個存儲庫模式。 Repository實現將負責檢索工廠用於構建其對象的數據。你可以注入倉庫接口到你的工廠:

public class ModelParameterFactory : IModelParameterFactory 
{ 
    private readonly IModelParameterRepository Repository; 

    public ModelParameterFactory(IModelParameterRepository repository) 
    { 
     Repository = repository; 
    } 

    ...interface methods use the injected repository... 
} 

然後你會的,說DatabaseModelParameterRepository和FileModelParameterRepository。但我猜你也有周圍那些你將需要注入的邏輯,這樣要求另一家工廠:

public class ModelParameterRepositoryFactory : IModelParameterRepositoryFactory 
{ 
    public ModelParameterRepositoryFactory(...inputs needed to determine which repository to use...) 
    { 
     ...assign... 
    } 
    ...determine which repository is required and return it... 
} 

在這一點上,它可能會更有意義注入IModelParameterRepositoryFactory到ModelParameterFactory,而比注入IModelParameterRepository。

public class ModelParameterFactory : IModelParameterFactory 
{ 
    private readonly IModelParameterRepositoryFactory RepositoryFactory; 

    public ModelParameterFactory(IModelParameterRepositoryFactory repositoryFactory) 
    { 
     RepositoryFactory = repositoryFactory; 
    } 

    ...interface methods get repository from the factory... 
} 

無論您使用DI容器與否,對採用何種存儲庫,並利用其工廠現已搬進了相關工廠實現,而不是調用代碼或DI配置的所有邏輯。

雖然不是非常複雜,但這種設計讓我停下來想知道您的ModelParameterFactory和ModelParameters是否過於通用。你可以從嘲笑他們到單獨的,更具體的課堂中受益。結果將是一個更簡單,更具表現力的設計。但是,如果情況並非如此,以上應該適用於您。

0

以我的觀點來看,狀態是你存儲在內存中的東西,比如靜態對象,全局變量,緩存或會話。通常在DI中,這些狀態不被維護,而是作爲參數傳遞。示例:

public IEnumerable<Records> GetRecordByUserId(string userId){ /*code*/ } 

userId正在傳遞,而不是在存儲庫中維護。

但是,當你想讓它們像配置一樣,而不是每次你做查詢時傳遞,我認爲你可以注入它作爲包裝類。有關更多信息,請參閱我的question。但是,我不建議在存儲庫中使用這種設計,但我建議在服務級別。