如何将参数传递给Ninject创建的瞬态对象?

时间:2012-05-28 01:50:39

标签: c# ninject

我正在使用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)。当然,它应该是线程安全的。

有什么想法吗?

1 个答案:

答案 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调用。