【问题标题】:Is there a workaround for dependency injection in a class library?在类库中是否有依赖注入的解决方法?
【发布时间】:2016-07-08 07:49:10
【问题描述】:

我有一个类库,我在内部构建了使用依赖注入 (ninject)。它被各种项目使用; MVC、windows服务、REST api等

我只是有一个这样的课程:

public class KittenInvestigator
{
   [Inject]
   public IKittenDetectorDevice KittenDetectorDevice { get; set; }

   ...
}

谷歌搜索到死我发现在类库中初始化 ninject 是不可能的,因为没有“启动”方法或钩子。

我正在寻找解决方法。关于这个问题的帖子很多,但我找不到任何解决方案或解决方法。有什么想法吗?

我考虑过的一些事情:

  • 将绑定放入引用库的项目中。这非常糟糕,因为注入是在库内部使用的,因此外部组件永远不会知道它 - 他们必须神奇地知道添加这些绑定,否则库将无法工作。

  • 某种反射,使我在主项目中的 ninject 代码扫描所有程序集以查找 ninject 模块并初始化它们。

  • 类库中的静态初始化方法,必须由将设置 ninject 东西的主项目调用(看起来很俗气)。

  • 其他一些巧妙的设计。

【问题讨论】:

标签: c# ninject


【解决方案1】:

您可以有一个启动方法,创建一个名为 bootstrapper 的静态类,并在静态构造函数中组合您的 DI 容器。

【讨论】:

  • 启动方法在哪里?在引用类库的主项目中?
  • 当你运行一个引用库的项目时,将执行静态构造函数。
【解决方案2】:

可以在加载程序集时使用Fody.ModuleInit 自动引导库。但我不会推荐它,而是做以下任何一种:

  • 按照 Mark Seeman 所述的明确方式(Steven 已经提供了一个链接作为对您帖子的评论:DI friendly library
  • 仔细权衡利弊后,选择使用 ninject 模块并使用 Dynamic Module Loading 或类似但自定义的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    相关资源
    最近更新 更多