1

我正在开发一个使用 NInject 创建对象实例的 ASP.NET MVC 3 项目。它为每个动作构建一个对象图。它在大多数情况下运行良好。但是,我有一个新要求,我必须将一些参数(来自请求)传递给对象图中的一些对象(它们是瞬态的)。我怎样才能做到这一点?这是一个例子:

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 属性被注入了一个IProcess由 NInject 创建的实例。场景背后有一个复杂的对象图。我想将“值”传递给对象图中的一个对象,该对象是实例IOptions使用的瞬态IProcess实例。该IOptions接口有一个名为 的方法SetValue(int)

我想做的是,当创建 IOptions 对象时,它的 SetValue(int) 将被调用。当然,它应该是线程安全的。

任何的想法?

4

1 回答 1

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

于 2012-05-31T23:06:45.590 回答