我正在使用NInject开发一个ASP.NET MVC 3项目来创建对象实例。它为每个Action构建一个对象图。它在大多数情况下都很有效。但是,我有一个新的要求,我必须将一些参数(从请求)传递到对象图中的一些对象(它们是瞬态的)。 我怎样才能做到这一点?这是一个例子:
class MyController : Controller
{
[Inject]
public IProcess Process {get;set;}
public ActionResult MyAction(int value)
{
// how to pass the 'value' to an object (IOptions) created by NInject
this.Process.Run();
}
}
如上面的代码所示,Process属性注入了由NInject创建的IProcess
实例。场景背后有一个复杂的对象图。而且我希望传递“价值”'到对象图中的一个对象,它是IOptions
实例使用的IProcess
的瞬态实例。 IOptions
接口有一个名为SetValue(int)
的方法。
我想要做的是,当创建IOptions对象时,将调用它的SetValue(int)。当然,它应该是线程安全的。
有什么想法吗?
答案 0 :(得分:2)
HY
这可以通过自定义工厂或Ninject.Factory.Extension
实现,它可以完成所有幕后工作。我将在这里展示手动方法:
public interface IProcessFactory {
IProcess Create(int value);
}
public class ProcessFactory : IProcessFactory {
public IProcess Create(int value)
{
return this.kernel.Get<IProcess>(new Parameter("value", value, true));
}
}
模块中的某个地方:
this.Bind<IProcess>().To<Process>();
this.Bind<IOption>().To<Option>()
.OnActivation((ctx, o) => o.SetValue((int)ctx.Parameters.Single(p => p.Name == "value").GetValue(ctx, ctx.Request.Target)));
我认为在ninject扩展中的某处应该还有一个扩展方法,可以简化OnActivation
调用。