【问题标题】:Ninject Interception extension is creating 2 instances of the class; is there a way to avoid thisNinject Interception 扩展正在创建该类的 2 个实例;有没有办法避免这种情况
【发布时间】:2011-07-12 21:05:02
【问题描述】:

我在使用带有 DynamicProxy2 的 Ninject 拦截扩展时遇到问题。本质上,我的绑定对象的两个实例被创建。我的绑定是:

this.Bind<TestInterface1>().ToSelf().Intercept().With(new ActionInterceptor(i => Console.WriteLine("In interceptor")));

第一个实例似乎是作为正常解决过程的一部分创建的。第二个实例是作为代理创建的一部分创建的,特别是在 DynamicProxy3ProxyFactory.cs 中。

reference.Instance = this.generator.CreateClassProxy(targetType, ProxyOptions, parameters, wrapper);

第二个实例似乎取代了 Ninject 上下文中的第一个实例(尽管我对此不是 100% 确定),所以人们会相信一切都很好。第一个实例只会持续一纳秒。不幸的是,我的构造函数并不是那么“干净”,并且运行它两次会引起一些混乱。由于第二个实例的构建是在 Castle 中完成的,我不知道是否有办法解决这个问题,但任何建议都将不胜感激(重写构造函数已被考虑并被击落:))。

【问题讨论】:

    标签: ninject ninject-extensions


    【解决方案1】:

    您似乎不了解使用动态代理进行拦截的工作原理。动态代理是一个新类,它派生自被拦截的类/接口,并将所有调用转发到被拦截的类/接口。

    例如

    class A{ }
    class AProxy : A {}
    

    现在创建了两个类的实例。因为 AProxy 调用基本构造函数,所以您会看到构造函数的两次调用。您还假设立即收集一个实例是错误的。它们的寿命完全相同。

    最干净的解决方案是解决你的构造函数不能被调用两次的问题。这是一个强烈的迹象,表明存在严重错误。其他可能性是使用 2.3beta 并使用接口而不是类或将问题代码放入初始化方法中,该方法仅由真实类而不是代理调用。

    【讨论】:

    • 感谢您的回答。你是城市
    • 对不起。试图在 DROID 上编辑它。感谢您的回答。我们决定暂时使用初始化器。
    【解决方案2】:

    我认为 Remo 的回答并不准确。它看起来不像“代理如何工作”。如果我们通过下面的简单代码直接使用 Castle,很明显正在创建继承用户类的子类,实际上不需要第二个实例。 所以,两个实例似乎是 Ninject 拦截设计的最终效果,原因我不知道。

    Ninject 拦截的两个实例看起来像是 Ninject 设计的最终结果,其中代理生成器实际上是一个“激活策略”(Ninject.Activation.Strategies.ActivationStrategy),它在实例创建之后起作用,所以它没有其他选择,但要创建另一个(代理)实例。这样做的原因也很公平,因为关于实例构造的所有细微差别只有容器本身知道,并且像不同的“激活策略”这样的“扩展”是故意与这样的方面分开的。

    void Main()
    {
        var x = new ProxyGenerator().CreateClassProxy(typeof(Test), new Interceptor()) as Test;
    }
    
    public class Test
    {
        public Test()
        {
            $"ctor for {GetType().FullName} base is {GetType().BaseType.FullName}".Dump();
        }
    }
    

    输出为(单行,单实例):

    Castle.Proxies.TestProxy 基础的ctor 是 UserQuery+Test

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      相关资源
      最近更新 更多