2012-05-28 20 views
1

我正在开发一个使用NInject创建对象实例的ASP.NET MVC 3项目。它为每个Action构建一个对象图。它在大多数情况下运作良好。但是,我有一个新的要求,即必须将一些参数(从请求)传递到对象图中的一些对象(它们是暂态的)。 我该怎么做?下面是一个例子:如何将参数传递给由Ninject创建的瞬态对象?

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(); 
    } 
} 

如在上面的代码中所示,处理场所被注射受NInject创建的IProcess一个实例。场景后面有一个复杂的对象图。我想将'value'传递给对象图中的一个对象,这是IProcess实例使用的IOptions的一个瞬态实例。 IOptions接口有一个名为SetValue(int)的方法。

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

有什么想法?

+0

当MyAction被调用时,您是否可以创建IProcess实例?然后我可以给你一个答案 –

+0

是的,可以在MyAction中创建IProcess。请帮忙。注意:解决方案应该是线程安全的,因为MyAction()将在不同的线程上执行。 – Zach

回答

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调用扩展方法的地方。

+0

Aha,OnActivation(),非常感谢! – Zach

相关问题