【问题标题】:With.Parameters.ConstructorArgument with ninject 2.0With.Parameters.ConstructorArgument 与 ninject 2.0
【发布时间】:2010-11-25 08:05:08
【问题描述】:

如何在ninject 2.0中使用这个功能?

MyType obj = kernel.Get<MyType>(With.Parameters.ConstructorArgument("foo","bar"));

“With”不存在 :(

【问题讨论】:

    标签: c# ninject


    【解决方案1】:
       [Fact]
       public void CtorArgTestResolveAtGet()
       {
           IKernel kernel = new StandardKernel();
           kernel.Bind<IWarrior>().To<Samurai>();
           var warrior = kernel
               .Get<IWarrior>( new ConstructorArgument( "weapon", new Sword() ) );
           Assert.IsType<Sword>( warrior.Weapon );
       }
    
       [Fact]
       public void CtorArgTestResolveAtBind()
       {
           IKernel kernel = new StandardKernel();
           kernel.Bind<IWarrior>().To<Samurai>()
               .WithConstructorArgument("weapon", new Sword() );
           var warrior = kernel.Get<IWarrior>();
           Assert.IsType<Sword>( warrior.Weapon );
       }
    

    【讨论】:

    • 我可以使用 ResolveAtGet 将参数传递给对象图中的对象吗?
    • Get 方法调用仅将参数传递给正在解析的顶级项目。除此之外,如果您希望将参数传递给链中更深的对象,则必须在绑定中执行此操作。
    • @Zach(和 Ian,但他知道这一点!)底层的 WithConstructorArgument / ConstuctorArgumetn ctor 有一个重载,它允许将 args 标记为继承,这会导致它们像我认为的那样传播到子分辨率中想。 (一般来说这是错误的方法,会造成混乱,但它肯定在那里)
    【解决方案2】:

    我不确定 Ninject 是否支持它(我目前不在我的开发计算机旁),但如果所有其他方法都失败了(Ninject 文档还有很多不足之处),您可以将初始化与构造函数分开来解决您的问题问题:

    class MyType 
    {
       public class MyType() {}
       public class MyType(string param1,string param2){Init(param1,param);}
       public void Init(string param1,param2){...}
    }
    

    那么你可以这样做:

    MyType obj = kernel.Get<MyType>();
    obj.Init("foo","bar");
    

    它远非完美,但在大多数情况下应该可以完成这项工作。

    【讨论】:

    • 感谢您的回答,但不幸的是,如果没有这个参数,我无法调用我的对象的构造函数... Ninject 1.x 做得很好,我想知道这个功能是如何改变的在 2.0 版本中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多