Ninject - 在web.config文件中定义映射

时间:2014-09-03 15:07:40

标签: asp.net asp.net-mvc ninject

我使用Ninject作为ASP.NET MVC应用程序的IoC容器。我目前正在做的是我的项目中有以下几层:

  • 核心
  • 基础设施
  • 逻辑
  • UI(ASP.NET MVC)

基础设施,逻辑和用户界面都引用了Core和Factory,它们都引用了所有。

当我的ASP.NET应用程序加载时,我在我的Factory中调用一个方法并向它传递一个枚举值,告诉它运行它的人(UI或任何其他UI等效层 - 例如,我希望UI能够对着Cache运行类和Backoffice项目跳过接口的Cache实现并直接对数据库工作)。然后该方法检查枚举并相应地在Ninject中进行映射。

首先关闭,我在这里做的是好习惯吗?每一层都不知道它旁边的层,因此松散耦合。但另一方面,工厂引用了所有层 - 这使得它紧密耦合。

第二次,我的映射在我的工厂层中是硬编码的 - 我想要的是.config文件(web.config)中的映射 - 这可能吗?

由于

2 个答案:

答案 0 :(得分:1)

不可避免地,您的解决方案将始终至少有一个项目,其他一切依赖于。否则,您可以将其分解为单独的解决方案,因为您具有完全独立的应用程序。目标是消除重复并创造责任区;依赖是给定的。

就Ninject配置而言,支持XML配置。不幸的是,这些文档的设计很差,并且不允许深层链接,因此我只能简单地为您提供一个URL。但是,如果你转到http://www.ninject.org/wiki.html,在左边,展开" Ninject"标题,然后"使用Ninject",最后" Xml配置",您将获得所需的信息。

答案 1 :(得分:0)

通常应该使用composition roots。组合根(通常是UI)定义了使用哪些绑定(映射)并一次性实现对象图(好吧......并不总是可行,但目标是尽可能接近这个理想)。

如果我理解正确的话,你已经用一个带有" enum"的工厂替换了多个组合词根。参数。可能是因为单个实例/层负责映射。 (首选?!)替代方法是将其移动到组合根,在那里您不需要"开关(枚举)"。要减少代码重复,请将共享绑定放入您重复使用的单独程序集或配置文件中。您可能还想查看可以帮助您的NinjectModule's

就XML的ninject配置而言,我建议不要这样做。它更脆弱(更新等)。只有在实施后需要能够修改的映射时才能执行此操作。但是,对于大多数配置问题,完全可能(并建议)以不同方式执行此操作。例如:

配置文件:

DatabaseProvider = MicrosoftSQL // OracleSQL if you want to use Oracle DB...

ninject binding:

Bind<IDatabaseProvider>().To<MicrosoftSqlDatabaseProvider>()
    .When(x => config.DatabaseProvier == "MicrosoftSQL");
Bind<IDatabaseProvider>().To<OracleSqlDtabaseProvider>()
    .When(x => config.DatabaseProvier == "OracleSQL");