【问题标题】:ninject setter injection in attribute routing Web API属性路由 Web API 中的 ninject setter 注入
【发布时间】:2018-08-23 10:43:29
【问题描述】:

我正在尝试 ninject.mvc5 对 Web API 应用程序进行 DI。

我在我的主 MVC 项目中添加了 ninject 和 ninject.mvc5。我为 Web API 控制器添加了一个类库并使用了属性路由。我试图在 MVC 项目和类库上使用 Setter Injection 注入一个对象。对象在 MVC 项目中正确注入,而在类库中为空。

以下代码块来自 MVC 应用程序,其中 Stage 包含正确的对象。

public class HomeController : Controller
{
    [Inject]
    public IStage Stage { get; set; }
}

以下代码来自失败的类库。

public class UserController : ApiController
{
    [Inject]
    public IStage Stage { get; set; }
}

这里是绑定:

public class WebApiApplication : Ninject.Web.Common.WebHost.NinjectHttpApplication
{
    protected override void OnApplicationStarted()
    {
        base.OnApplicationStarted();
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        //RegisterDependencies();
    }

    protected override IKernel CreateKernel()
    {
        var kernal = new StandardKernel();
        kernal.Load(Assembly.GetExecutingAssembly(), 
            Assembly.Load("UserLibrary"), 
            Assembly.Load("StageContracts"), 
            Assembly.Load("StageLibrary"));
        return kernal;
    }
}

public class DependencyMapper : NinjectModule 
{ 
    public override void Load() 
    { 
        this.Bind<IStage>().To<Stage>(); 
    } 
}

不确定我在这里缺少什么。任何帮助将不胜感激。

【问题讨论】:

  • 您是否为 Web API 正确设置了 DependencyResolver?也建议通过构造函数进行注入。
  • ninject.mvc5 是强制的吗?
  • 你的绑定在哪里?
  • 我的绑定在 MVC 项目中。下面我在 Global.asax.cs protected override IKernel CreateKernel() { var kernal = new StandardKernel(); //Added here required assemblies. return kernal; } 中添加的代码还添加了 DependencyMapper 类
  • 我问的第一件事是DependencyResolver,这是框架用于注入的。如果配置不正确,那么您将遇到当前遇到的问题。显然,用于 MVC 的那个正在工作。显示 web api 配置。

标签: c# asp.net-web-api dependency-injection asp.net-web-api2 ninject.web.mvc


【解决方案1】:

我怀疑你的DependencyMapperclass 没有被加载。

来自有关您用于加载程序集的重载的文档:

public static Assembly Load(string assemblyString)

汇编字符串 类型:System.String 程序集名称的长格式。

例如:

string longName = "system, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";

确保在为内核加载程序集时提供长名称。

【讨论】:

    【解决方案2】:

    感谢@JuanR 和@NKosi。

    终于,我得到了解决方案。由于项目解决方案同时包含 MVC 和 Web API,我们必须设置这两种类型的 DependencyResolver - System.Web.Http.Dependencies.IDependencyResolver, System.Web.Mvc.IDependencyResolver。下面的链接是帮助解决它的链接。

    http://blog.developers.ba/simple-way-share-container-mvc-web-api/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多