C# 如何使用Web API控制器的参数将依赖项注入工厂

C# 如何使用Web API控制器的参数将依赖项注入工厂,c#,asp.net-web-api,dependency-injection,inversion-of-control,ninject,C#,Asp.net Web Api,Dependency Injection,Inversion Of Control,Ninject,我有一个Web API项目,安装了以下软件包: 尼尼特 尼尼特工厂 Ninject.MVC5 Ninject.Web.Common(和WebHost) Ninject.Web.WebApi(和WebHost) 我正在尝试使用Http方法中的参数进行注入。其中一个依赖项本身依赖于另一个同样需要Http方法参数的依赖项。我如何构建这个?当访问端点时,我收到“确保您的控制器具有无参数”错误 public interface IFooFactory { Foo.Foo Create(stri

我有一个Web API项目,安装了以下软件包:

  • 尼尼特
  • 尼尼特工厂
  • Ninject.MVC5
  • Ninject.Web.Common(和WebHost)
  • Ninject.Web.WebApi(和WebHost)
我正在尝试使用Http方法中的参数进行注入。其中一个依赖项本身依赖于另一个同样需要Http方法参数的依赖项。我如何构建这个?当访问端点时,我收到“确保您的控制器具有无参数”错误

public interface IFooFactory {
    Foo.Foo Create(string arg1, IBar barService);
}

public class FooFactory : IFooFactory {
    private readonly IResolutionRoot resolutionRoot;

    public FooFactory(IResolutionRoot resolutionRoot) {
        this.resolutionRoot = resolutionRoot;
    }

    // Need dependency injected here... How? barService also needs http args
    public Foo.Foo Create(string arg1, IBarService barService) {
        return resolutionRoot.Get<Foo.Foo>(
            new ConstructorArgument("arg1", arg1),
            new CosntructorArgument("barService", barService)
            );
    }
}
如果我添加了一个
IBarFactory barFactory
,如何将其传递给
FooFactory

我为IBarService创建了另一个工厂,从Http传递参数:

第二工厂

public interface IBarFactory
{
    BarService.BarService Create(string arg1);
}

public class BarFactory : IBarFactory
{
    private readonly IResolutionRoot resolutionRoot;

    public BarFactory(IResolutionRoot resolutionRoot)
    {
        this.resolutionRoot = resolutionRoot;
    }

    public BarService Create(string arg1)
    {
        return resolutionRoot.Get<BarService>(
            new ConstructorArgument("arg1", arg1));
    }
}
公共接口IBarFactory
{
BarService.BarService创建(字符串arg1);
}
公共级酒吧工厂:IBarFactory
{
私有只读IResolutionRoot resolutionRoot;
公共酒吧工厂(IResolutionRoot resolutionRoot)
{
this.resolutionRoot=resolutionRoot;
}
公共服务创建(字符串arg1)
{
返回resolutionRoot。获取(
新的构造函数参数(“arg1”,arg1));
}
}
如何使用HTTP参数

public FooFooController : ApiController {

    private readonly IFooFactory fooFactory;
    private readonly IBarFactory barFactory;

    public FooFooController(IFooFactory fooFactory, IBarFactory barFactory) {
        this.fooFactory = fooFactory;
        this.barFactory = barFactory;
    }

    [HttpPost]
    public async Task<JsonResult> Post(string arg1) {
        // arguments are consumed here
        var barService = this.barFactory.Create(arg1);
        var fooService = this.fooFactory.Create(arg1, barService);
    }
}
公共控制器:ApiController{
私有只读IFooFactory fooFactory;
私人只读IBarFactory barFactory;
公共FooController(IFooFactory fooFactory、IBarFactory barFactory){
this.fooFactory=fooFactory;
this.barFactory=barFactory;
}
[HttpPost]
公共异步任务Post(字符串arg1){
//参数在这里使用
var barService=this.barFactory.Create(arg1);
var fooService=this.foodfactory.Create(arg1,barService);
}
}

您能举例说明用于检索“HTTP参数”的逻辑吗?@BatteryBackupUnit请参阅edit您已经获得了所有部分。。但Ninject似乎设置不正确。这就是为什么您得到了
确保控制器具有无参数构造函数的消息。当Ninject正确设置以解决依赖关系时,不应该发生这种情况。如果Ninject无法解析类型,它将抛出另一个异常。因此,这与绑定无关,而是与Ninject如何集成到项目中有关。
public FooFooController : ApiController {

    private readonly IFooFactory fooFactory;
    private readonly IBarFactory barFactory;

    public FooFooController(IFooFactory fooFactory, IBarFactory barFactory) {
        this.fooFactory = fooFactory;
        this.barFactory = barFactory;
    }

    [HttpPost]
    public async Task<JsonResult> Post(string arg1) {
        // arguments are consumed here
        var barService = this.barFactory.Create(arg1);
        var fooService = this.fooFactory.Create(arg1, barService);
    }
}