Asp.net mvc 2 在使控制器IoC框架不可知的情况下,如何将Ninject与ActionResults一起使用?

Asp.net mvc 2 在使控制器IoC框架不可知的情况下,如何将Ninject与ActionResults一起使用?,asp.net-mvc-2,dependency-injection,inversion-of-control,ninject,actionresult,Asp.net Mvc 2,Dependency Injection,Inversion Of Control,Ninject,Actionresult,我看到的几乎所有Ninject示例都解释了如何在ASP.NET MVC中使用它,它将自动向控制器中注入依赖项。但是我如何手动使用Ninject?假设我有一个自定义ActionResult: public class JsonResult : ActionResult { [Inject] public ISerializer Serializer { get; set; } public JsonResult(object objectToSerialize) {

我看到的几乎所有Ninject示例都解释了如何在ASP.NET MVC中使用它,它将自动向控制器中注入依赖项。但是我如何手动使用Ninject?假设我有一个自定义ActionResult:

public class JsonResult : ActionResult
{
    [Inject] public ISerializer Serializer { get; set; }

    public JsonResult(object objectToSerialize)
    {
        // do something here
    }

    // more code that uses Serializer
}
然后,在我的控制器中,我使用
JsonResult
的方法如下:

public ActionResult Get(int id)
{
    var someObject = repo.GetObject(id);
    return new JsonResult(someObject);
}
public ActionResult Get(int id)
{
    var result = IoC.Kernel.Get<JsonResult>();

    result.ObjectToSerialize = repo.GetObject(id);

    return result;
}
如您所见,我自己实例化了对象,它避开了Ninject的注入,
Serializer
将为空。然而,我觉得用以下方法做这件事不太合适:

public ActionResult Get(int id)
{
    var someObject = repo.GetObject(id);
    return IoC.Kernel.Get<JsonResult>(someObject);
}
public-ActionResult-Get(int-id)
{
var someObject=repo.GetObject(id);
返回IoC.Kernel.Get(someObject);
}
因为现在控制器中不仅存在对Ninject的依赖,而且我还必须在静态类/单例中公开Ninject内核,并确保依赖注入的对象只能通过内核创建


有没有一种方法可以配置Ninject来注入依赖项而不依赖于公开内核?如果可能的话,我希望能够使用
new
关键字。

我认为您应该将
JsonResult
翻过来:

public class JsonResult : ActionResult
{
    public ISerializer Serializer { get; private set; }

    public object ObjectToSerialize { get; set; }

    public JsonResult(ISerializer serializer)
    {
        this.Serializer = serializer;
    }

    // more code that uses Serializer
}
通过这种方式,您可以使用如下容器检索
JsonResult

public ActionResult Get(int id)
{
    var someObject = repo.GetObject(id);
    return new JsonResult(someObject);
}
public ActionResult Get(int id)
{
    var result = IoC.Kernel.Get<JsonResult>();

    result.ObjectToSerialize = repo.GetObject(id);

    return result;
}

使用注入内核的工厂:例如

public class ResultFactory : IResultFactory
{
    public ResultFactory(IKernel kernel)
    {
        this.kernel = kernel;
    }

    public JsonResult CreateJsonResult(object obj)
    {
        var result = this.kernel.Get<JsonResult>();
        result.ObjectToSerialize = obj;
        return result;
    }
}
公共类结果工厂:IResultFactory
{
公共结果工厂(IKernel内核)
{
this.kernel=内核;
}
公共JsonResult CreateJsonResult(对象obj)
{
var result=this.kernel.Get();
result.ObjectToSerialize=obj;
返回结果;
}
}

将此工厂注入控制器并使用它创建操作结果

这看起来和我的没有什么不同。它只是使用
ObjectToSerialize
反转
IoC.Kernel.Get
。我希望能够以最佳方式完全删除
IoC.Kernel.Get
调用。当您想要删除
IoC.Kernel.Get
调用时,应该让Ninject将依赖项注入控制器的构造函数中。通过改变
JsonResult
我展示的方式,允许您进行自动构造函数注入。看看我更新的例子。