I'd like to create a OnePerSessionBehavior for NInject (v1.0) and I've mostly got it working. The only issue that remains is how to pass in fresh arguments using .WithArguments() as each new session asks for something from the container. Right now I'm keeping a reference to the container as an application variable and therefore the module only ever gets loaded one time so of course the binding only occurs once.
For example, the following returns individual instances of 'Something' for each new session, but the constructor argument passed in to all sessions is the same DateTime.
Bind<ISomething>()
.To<Something>()
.Using<OnePerSessionBehavior>()
.WithArgument("currentDateTime", DateTime.Now);
Can you pass a lamda as your argument? For instance, if you have a class like this:
public class Something : ISomething
{
public Something(Action<DateTime> initializer)
{
var now = initializer();
}
}
You can bind it as follows:
Bind<ISomething>()
.To<Something>()
.Using<OnePerSessionBehavior>()
.WithArgument("initializer", () => { return DateTime.Now; });
Though I don't know you exact situation, another idea would be to create your object without worrying about argument injection, and then set your properties:
kernel.Bind<ISomething>().To<Something>().Using<OnePerSessionBehavior>();
var mySomething = kernel.Get<Something>();
mySomething.DateCreated = DateTime.Now;
or:
mySomething.Initialize(DateTime.Now);
Would either of those ideas work?
You're passing a value that's evaluated during the definition of the binding. That's why you get the same value over and over again.
Actually from the top of my head I don't have an easy answer to that but I'll definitely think about it as it might be useful for testing purposes for me to.