我应该在不能使用类的控制器中使用Lazy <t>吗?</t>

时间:2015-03-18 05:25:09

标签: c# class controller asp.net-mvc-5 lazy-initialization

我正在编写一个MVC 5互联网应用程序,并对使用延迟和延迟初始化有疑问。

Lazy Class文档说:

  

使用延迟初始化来推迟创建大型或   资源密集型对象,或资源密集型的执行   任务,特别是当这种创建或执行可能不会发生时   在该计划的整个生命周期中。

以下是我的情况:

我有一个具有验证服务类的控制器。此服务类仅在控制器创建或编辑函数中创建或编辑模型对象时使用。

我应该在这个验证课程中使用Lazy吗?我想也许,因为用户可以浏览索引,详细信息和删除功能,并且永远不会使用验证服务类。验证类有超过900行代码。

另外,我有一个异常服务类,用于在发生错误时显示自定义错误页面。此异常类有100行代码,仅在发生异常时使用。如果未发生异常,则不使用此类。我应该在这个例外类中使用Lazy吗?

我正在征求意见,因为我之前没有使用过Lazy,而且我不确定是否应该在上述两种情况下使用Lazy。

提前致谢。

修改

有人可以解释在上述情况下是否有任何理由不使用Lazy? Exception会缓存一些我需要担心的事情吗?

Validation服务类有一个接受IGenericMultipleRepository对象的构造函数。该对象是用于访问存储库的接口,我在单元测试时使用它。 Exception服务类有一个默认构造函数。

2 个答案:

答案 0 :(得分:0)

我肯定会使用延迟初始化验证服务。对于异常处理程序,您可以采用任何一种方式 - 预期异常。延迟初始化的好处是您的代码响应更快,使用的资源更少。缺点是学习新课程。一旦你学会了它,你就可以在很多地方使用。

答案 1 :(得分:0)

代码行实际上与实例化类的运行时成本无关。如果没有静态并且你有一个空的构造函数,那么实例化你的验证或异常类会很便宜。

更重要的问题是,通过使用Lazy或直接实例化它们,您将把控制器类紧密地耦合到这些服务类,这将使得单独测试它们变得更加困难。

在没有看到代码的情况下,很难确切地说,但我怀疑你最好不要使用依赖注入将每个类注入控制器(并为每个类都有一个接口)。

使用这种方法,您可以独立测试每个类,您可以将模拟替换为验证和异常类,并且下次有控制器时可以重用这些类而不是需要的类。

如果实例化一个类很昂贵,你仍然可以使用依赖注入容器,但是你可以使用Func<T>依赖项。请参阅示例Autofac

我还应该补充说,实例化成本高昂的类本身通常是个坏主意:构造函数不应该做大量工作。