【问题标题】:Implementing OnePerSessionBehavior in NInject在 NInject 中实现 OnePerSessionBehavior
【发布时间】:2010-10-10 03:12:34
【问题描述】:

我想为 NInject (v1.0) 创建一个 OnePerSessionBehavior,而且我大部分时间都在工作。剩下的唯一问题是如何使用 .WithArguments() 传入新的参数,因为每个新会话都要求容器提供一些东西。现在我将容器的引用保存为应用程序变量,因此模块只会加载一次,所以绑定当然只会发生一次。

例如,以下为每个新会话返回 'Something' 的各个实例,但传递给所有会话的构造函数参数是相同的 DateTime。

Bind<ISomething>()
    .To<Something>()
    .Using<OnePerSessionBehavior>()
    .WithArgument("currentDateTime", DateTime.Now);

【问题讨论】:

  • 我假设您需要的不仅仅是 DateTime.Now。你能详细说明一下你的要求吗? :)

标签: c# dependency-injection inversion-of-control ninject


【解决方案1】:

您传递的是在绑定定义期间评估的值。这就是为什么你一遍又一遍地获得相同的价值。 实际上,从我的脑海中,我没有一个简单的答案,但我肯定会考虑它,因为它可能对我的测试目的有用。

【讨论】:

    【解决方案2】:

    你能传递一个 lamda 作为你的论点吗?例如,如果您有这样的课程:

    public class Something : ISomething
    {
        public Something(Action<DateTime> initializer)
        {
            var now = initializer();
        }
    }
    

    可以如下绑定:

    Bind<ISomething>()
        .To<Something>()
        .Using<OnePerSessionBehavior>()
        .WithArgument("initializer", () => { return DateTime.Now; });
    

    虽然我不知道你的确切情况,但另一个想法是创建你的对象而不用担心参数注入,然后然后设置你的属性:

    kernel.Bind<ISomething>().To<Something>().Using<OnePerSessionBehavior>();    
    var mySomething = kernel.Get<Something>();
    mySomething.DateCreated = DateTime.Now;
    

    或:

    mySomething.Initialize(DateTime.Now);
    

    这些想法中的任何一个都行得通吗?

    【讨论】:

      猜你喜欢
      • 2015-11-23
      • 2013-06-08
      • 1970-01-01
      • 2015-02-10
      • 2015-12-08
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      相关资源
      最近更新 更多