2017-03-09 51 views
2

我目前正在優化MVC應用程序,在中有對象創建。這樣在C#中按需創建對象#

private readonly IUnitOfWork _unitOfWork; 
private readonly GenericRepository<User> _user; 
private readonly GenericRepository<UserDevice> _userDevice; 
public UsersController() 
{ 
    _unitOfWork = new UnitOfWork(); 
    _user = new GenericRepository<User>(_unitOfWork); 
    _userDevice = new GenericRepository<UserDevice>(_unitOfWork); 
} 

這東西很簡單的例子,但其實有很多對象創造,甚至還有隻需要一個對象function但其他對象被創建爲好。我想實現一個模式,只在需要時才創建對象。

有一件事是在我的腦海中使用Abstract Factory Pattern所有的對象應該創建,但我不知道如何實現。你們可以爲這個問題提出任何其他解決方案,使用模式只是我的想法。由於

編輯
按需指使用在method對象,就像我只需要_user對象,那麼爲什麼會出現_userDevice創造?

+0

「對象應該只在需要時創建」 - 在哪裏?什麼時候?你的問題不清楚。 「需要時」是一個不明確的短語,因爲它可能意味着:1)在執行過程中的某個角錢,或2)在你的代碼中,不會在每個代碼路徑中被調用,但仍然是靜態定義在碼。 –

+0

如果你的課程需要很多對象,但只是偶爾使用它,很可能違反[單一職責原則](https://en.wikipedia.org/wiki/Single_responsibility_principle)。您可能需要重新審視您的設計,並牢記[SOLID](https://en.wikipedia.org/wiki/SOLID_(面向對象設計))原則。但是,要真正回答您的問題,是否考慮使用[懶惰](https://msdn.microsoft.com/en-us/library/dd642331(v = vs.110).aspx)僅在創建對象時他們實際上是必需的? –

+0

這些物體是否很昂貴?你是否優化,因爲你分析了你的代碼? –

回答

4

Lazy<T>似乎正是你在找什麼。

private readonly Lazy<IUnitOfWork> _lazyUnitOfWork; 

public UsersController() 
{ 
    _layzUnitOfWork = new Lazy<IUnitOfWork>(() => new UnitOfWork()); 
} 

// Instantiates the unit of work on first use 
private IUnitOfWork _unitOfWork { get { return _lazyUnitOfWork.Value; } } 
+0

感謝您的回覆。還有一件事,我正在考慮從Controller中移除所有初始化,創建一個Abstract類,並使用Lazy 添加所有對象,並在該Abstract類上創建具體的類。這是個好主意嗎? –

+0

@AliShahbaz:我看不出有什麼問題。 – Heinzi

+0

好的,謝謝你。 –