我正在编写一个MVC 5互联网应用程序,并对使用延迟和延迟初始化有疑问。
Lazy Class文档说:
使用延迟初始化来推迟创建大型或 资源密集型对象,或资源密集型的执行 任务,特别是当这种创建或执行可能不会发生时 在该计划的整个生命周期中。
以下是我的情况:
我有一个具有验证服务类的控制器。此服务类仅在控制器创建或编辑函数中创建或编辑模型对象时使用。
我应该在这个验证课程中使用Lazy吗?我想也许,因为用户可以浏览索引,详细信息和删除功能,并且永远不会使用验证服务类。验证类有超过900行代码。
另外,我有一个异常服务类,用于在发生错误时显示自定义错误页面。此异常类有100行代码,仅在发生异常时使用。如果未发生异常,则不使用此类。我应该在这个例外类中使用Lazy吗?
我正在征求意见,因为我之前没有使用过Lazy,而且我不确定是否应该在上述两种情况下使用Lazy。
提前致谢。
修改
有人可以解释在上述情况下是否有任何理由不使用Lazy? Exception会缓存一些我需要担心的事情吗?
Validation服务类有一个接受IGenericMultipleRepository
对象的构造函数。该对象是用于访问存储库的接口,我在单元测试时使用它。 Exception服务类有一个默认构造函数。
答案 0 :(得分:0)
我肯定会使用延迟初始化验证服务。对于异常处理程序,您可以采用任何一种方式 - 预期异常。延迟初始化的好处是您的代码响应更快,使用的资源更少。缺点是学习新课程。一旦你学会了它,你就可以在很多地方使用。
答案 1 :(得分:0)
代码行实际上与实例化类的运行时成本无关。如果没有静态并且你有一个空的构造函数,那么实例化你的验证或异常类会很便宜。
更重要的问题是,通过使用Lazy或直接实例化它们,您将把控制器类紧密地耦合到这些服务类,这将使得单独测试它们变得更加困难。
在没有看到代码的情况下,很难确切地说,但我怀疑你最好不要使用依赖注入将每个类注入控制器(并为每个类都有一个接口)。
使用这种方法,您可以独立测试每个类,您可以将模拟替换为验证和异常类,并且下次有控制器时可以重用这些类而不是需要的类。
如果实例化一个类很昂贵,你仍然可以使用依赖注入容器,但是你可以使用Func<T>
依赖项。请参阅示例Autofac。
我还应该补充说,实例化成本高昂的类本身通常是个坏主意:构造函数不应该做大量工作。