asp.net-mvc - Unity.MVC4惰性<T>在ASP.NET MVC应用程序中不起作用

标签 asp.net-mvc inversion-of-control lazy-loading unity-container deferred-loading

我正在使用 ASP.NET MVC 4 应用程序。

Home Controller 的构造函数有2个参数(Iservice1 service1, Iservice2 service2) 并非所有代码路径都使用任何 Service(service1、service2),只有在某些代码路径中我需要 service1 实例/对象或 service2 实例/对象。

我不想使用container.Resolve<<Lazy<IService1> >();

从此链接 ( http://msdn.microsoft.com/en-us/library/dn178463(v=pandp.30).aspx ) 我了解到 unity.mvc 4 使用具有延迟加载支持的 unity 3,但如何在 ASP.NET MVC 4 中执行此操作。

最佳答案

一般来说,实例构造函数应该只做适当的空检查并存储传入的引用。这使得对象图的构建变得快速并且reliable 。任何初始化都应该推迟到稍后的时间,即第一次使用该组件的时间。

在大多数情况下,这将防止为了性能而延迟创建组件的需要,如果这确实仍然是一个问题,您可能需要考虑具有 better performance 的容器。 .

对于那些需要延迟创建的空闲时刻,不要使用 Lazy<T>为了这。注入(inject)Lazy<T>leaky abstraction ,就像 IDisposable是当放置在接口(interface)上时。注入(inject)Lazy<T>泄漏,因为从理论上讲,每个依赖项都可能很慢或者可能需要推迟。为了防止在引入较慢的服务实现时必须对整个应用程序进行彻底的更改,我们最好将应用程序中的每个依赖项设置为Lazy<IDependency>。提前,因为这使我们不必稍后进行更改。

但这当然是愚蠢和丑陋的。但是,即使应用程序足够小,可以承受这种彻底的更改,消费者为什么应该知道或关心该服务需要延迟初始化这一事实呢?这不是一个实现细节吗?为什么我们要把这种懒惰的行为融入到这项服务的契约中?这样做会使我们的代码和需要编写的测试变得更加复杂。这是不需要的accidental complexity .

所以不要注入(inject) Lazy<IService1> ,你应该简单地注入(inject) IService1并实现并注册一个实现惰性行为的代理。这实际上很容易做到,如下所示:

public class LazyService1Proxy : IService1
{
    private Lazy<IService1> service;

    public LazyService1Proxy(Lazy<IService1> service) => this.service = service;

    void IService1.Method1() => this.service.Value.Method1();

    object IService1.Method2(string foo) => this.service.Value.Method2(foo);
}

此代理可以按如下方式注册:

container.Register<IService1>(new InjectionFactory(c => 
    new LazyService1Proxy(
        new Lazy<IService1>(
            () => c.Resolve<RealService1Impl>()))));

关于asp.net-mvc - Unity.MVC4惰性<T>在ASP.NET MVC应用程序中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21709902/

相关文章:

c# - 如何将自定义模型对象从 Razor View 传递到 ASP.NET MVC 5 中的 Controller 操作

java - 使用 Spring IoC 配置 SSL ReSTLet 服务器?

c# - 使用 Autofac 注入(inject)接口(interface)的特定实例

orm - Extbase:在运行时选择延迟加载或预先加载

python - 如何在 SQLAlchemy 中加载嵌套关系?

.net - 如何从 ASP.NET MVC 中的 Controller 构造函数找到文件夹的路径?

c# - 使用 Grid.Mvc 发布所有选定的行

jquery - 如何将 Javascript 放入 Coldfusion Model Glue 页面的 <head> 元素中?

c# - 将 TinyIoC 与 MonoTouch + Storyboard一起使用 - 在哪里构建?

php - 在延迟加载中避免条件