【问题标题】:Designing a Nuget Package with Dependency Injection使用依赖注入设计 Nuget 包
【发布时间】:2013-08-18 14:58:24
【问题描述】:

我们目前正在编写一个充当服务网关的 nuget 包。它的职责是结束对外部服务的调用,以便以正确的方式进行并正确处理响应。其目的是减少新客户端想要使用外部服务时的开发时间开销。

nuget 包是从外部服务解决方案中的单个项目(称为“客户端”)构建的。这样客户端项目就可以共享一个公共域,并在发布时保持内部版本号同步。客户端项目应用控制反转原则,这意味着作为入口点的类(从外部服务获取响应的堆栈的开始)具有许多接口依赖关系。

我们通常使用 StrucutreMap 作为我们的 IoC 容器,但我想知道我们如何使用“内置”依赖注入来配置我们的客户端项目?每个消费者都应该为包连接依赖解析似乎是错误的。但是,也不应该是每个客户端都应该使用 StructureMap 并且必须将“ClientRegistry”(初始化程序)类添加到自己的启动逻辑中。

是否有任何指导原则可以帮助解决这个问题?或者任何基于 IoC 原则构建的复杂 nuget 包的好例子?

【问题讨论】:

    标签: dependency-injection inversion-of-control nuget structuremap


    【解决方案1】:

    您可以使用 CommonServiceLocator - 它不像完整的 IoC 容器那么丰富,但它会使您的包容器不可知,并且应该允许您的包的消费者继续使用他们选择的 IoC 容器。

    该库提供了对 IoC 容器和服务定位器的抽象。使用该库允许应用程序在不依赖硬引用的情况下间接访问这些功能。希望使用这个库,第三方应用程序和框架可以开始利用 IoC/服务位置,而无需将自己束缚于特定的实现。

    【讨论】:

    • 请注意,CSL 仅提供 Resolve 功能,但您可以添加第二个与 StructureMap 集成的 MyNyGetPackage.Integration.StructureMap
    • 我已经阅读了一些关于 CSL 的内容,我可以看到它的好处,但我仍然对如何解决这个问题感到困惑。我是否应该尝试公开 IServiceLocator 的实现,使消费应用程序可以“附加”到自己的 IoC 设置中?还是我只是依赖消费者中存在的 CSL 引用并在某种初始化任务中使用仅在客户端内部的容器调用 ServiceLocator.SetLocatorProvider?使用这种方法是否存在覆盖消费者现有容器的风险?
    • @Nick 啊,我想我明白你来自哪里了。在那种情况下,我看到一些在内部使用 autofac 的项目(即在内部设置并且 autofac 被合并到程序集中),然后将工厂对象暴露给外部世界。然后,工厂成为包及其内容的主要入口点。
    • 我已经做到了。我已经为 IServiceLocator 的实现公开了一个静态工厂,该工厂包装了一个预先配置的 StructureMap IContainer。然后,消费应用程序的启动逻辑使用此公开的服务定位器来解析客户端包入口点接口的实例。似乎工作正常,现在我只需要将客户端与域做大量分离以使客户端更轻量级......
    猜你喜欢
    • 2021-09-02
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多