2

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

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

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

2 回答 2

1

你可以通过一个 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);

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

于 2011-03-01T06:34:53.933 回答
0

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

于 2009-07-14T19:50:35.573 回答