2017-03-09 29 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

好的,谢谢你。 –