【问题标题】:Ninject dependency injection: Read bindings from config?Ninject 依赖注入:从配置中读取绑定?
【发布时间】:2013-08-13 21:30:06
【问题描述】:

我是自动依赖注入的新手,并试图用 MVC4 应用程序干净地实现 Ninject。一切正常,但我的强迫症想知道应用程序将如何根据 NinjectWebCommon.cs 中的 RegisterServices(IKernel 内核)方法中的列表绑定进行扩展。例如,

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IAbstractManagerA>().To<ConcreteManagerA>();
        kernel.Bind<IAbstractManagerB>().To<ConcreteManagerB>();
        kernel.Bind<IAbstractRepoA>().To<ConcreteRepoA>();
        ...etc etc could be hundreds
    }    

有没有更好的方法来处理这个问题?也许将每个配对作为 web.config 设置或其他配置文件?本质上为依赖注入注入依赖:)

【问题讨论】:

  • 您是否考虑过使用约定而不是配置? Ninject 和 Structuremap 为scanner.FromCallingAssembly()等配置提供了scanner函数;扫描仪.BindWithDefaultConventions();在我个人看来,混合 xml 文件配置和 IoC 不能很好地混合,这就是为什么该功能在结构映射中被弃用的原因,希望有所帮助!
  • 那你应该考虑微软的Unity:msdn.microsoft.com/en-us/library/ff647848.aspx
  • @ThanhNguyen:说真的,你不能只建议 Unity。 Unity 能做的很少,其他框架(例如 Ninject)不能做。
  • @Steven:我完全同意 Steven :) 我只是试图专注于他的特定需求而不是系统设计方面,无论如何,你是完全正确的!
  • @Pedro 你的想法很有趣。不知道 Ninject 有这样的功能。使用反射和命名约定可以消除对无休止的硬编码绑定以及外部配置文件的需要。我会进一步调查。谢谢!

标签: asp.net-mvc dependency-injection inversion-of-control ninject


【解决方案1】:

考虑围绕一些定义明确的通用抽象来设计您的应用程序,例如:

  • IRepository&lt;TEntity&gt; 隐藏数据库 CRUD 操作
  • ICommandHandler&lt;TCommand&gt; 定义您的系统业务运营/用例 (example)。
  • IQueryHandler&lt;TQuery, TResult&gt; 定义可由业务逻辑使用的自定义查询 (example)。
  • IValidator&lt;T&gt; 作为对可以验证实体或命令的类的抽象 (example)。

应用这种类型的设计有几个明显的好处:

  1. 它迫使您进行干净的SOLID 应用程序设计。
  2. 它可以轻松地围绕某个概念的所有实现添加横切关注点(例如,围绕每个业务操作添加事务的装饰器)。
  3. 它使batch register a whole range 的相关类型变得容易。
  4. 在此基础上构建可维护的解决方案变得更加容易,例如maintenance free WCF services

【讨论】:

  • 我一直很感兴趣地关注您的博客和关于 SO 的回答。这个答案总结了所有的好东西,包括例子。不能要求更多。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多