-
Notifications
You must be signed in to change notification settings - Fork 36
Open
Description
My problem:
public class RuntimeConfiguration
{
public int Number { get; set; }
}
public class DependencyOfDependency
{
public DependencyOfDependency(RuntimeConfiguration test)
{
Console.WriteLine(test.Number);
}
}
public class Dependency
{
public Dependency(DependencyOfDependency d) { }
}
public interface IDependencyFactory
{
Dependency Create(RuntimeConfiguration configuration);
}
var kernel = new StandardKernel(new FuncModule());
kernel.Bind<Dependency>().ToSelf();
kernel.Bind<DependencyOfDependency>().ToSelf();
kernel.Bind<IDependencyFactory>().ToFactory();
kernel.Get<IDependencyFactory>().Create(new RuntimeConfiguration { Number = 42 });
It prints 0 instead of 42.
My solution:
public class DependencyFactory : IDependencyFactory
{
private readonly IKernel kernel;
public DependencyFactory(IKernel kernel)
{
this.kernel = kernel;
}
public Dependency Create(RuntimeConfiguration configuration)
{
lock (kernel)
{
kernel.Bind<RuntimeConfiguration>().ToConstant(configuration);
var result = kernel.Get<Dependency>();
kernel.Unbind<RuntimeConfiguration>();
return result;
}
}
}
kernel.Bind<IDependencyFactory>().To<DependencyFactory>();
Problems with this approach:
(1) It feels like an unnecessary hack.
(2) Possible performance issues due to locking.
I can't figure out a better solution though. Any advice?
Metadata
Metadata
Assignees
Labels
No labels