【问题标题】:Is it possible to resolve dependencies inside class libraries without referencing container?是否可以在不引用容器的情况下解决类库中的依赖关系?
【发布时间】:2017-01-19 10:58:18
【问题描述】:

解决方案:

  • ClassLibrary.Abstract
    • 有很多美味的服务
  • ClassLibrary.Concrete
    • 包含上述服务的实现
  • MvcWebApp
    • 以上引用类
    • 包含组合根

所有内容都在组合根目录中注册,因此MvcWebApp 显然引用了容器,在我的情况下它是 Autofac 但我认为这并不重要。

问题: 什么是正确的方法(如果有的话)在运行时在类库中解析服务而不在解决方案中的任何地方添加对容器的引用,同时仍然能够控制生命周期范围?

【问题讨论】:

  • 您能否详细说明为什么需要延迟解析实例?
  • @steven 由 UI 触发的动作将根据参数使用不同的服务(如乐高积木)
  • @NightOwl888 谢谢,但我想的是比为所有这些服务创建工厂更通用的方法。类库中充满了这些服务(乐高积木),这些服务(乐高积木)旨在根据作业参数在运行时解析和释放。
  • 关于工厂的大警告:they are a code smell.

标签: c# .net dependency-injection autofac ioc-container


【解决方案1】:

如果服务需要子服务实现

  • 服务可以自己创建子服务
    • (a) 通过调用子服务的具体构造函数(无 ioc/di)
    • (b) 要求容器执行此操作。
    • (c) 服务可以要求一些工厂或服务定位器。
  • (d) 服务构造器具有所需子服务的参数/属性。有一个初始化模块通过调用带有参数的构造函数来连接所有需要的服务。

您的问题:是否可以避免 (b)?

如果在运行时延迟解析很重要,您必须执行 (c)

我更喜欢 (d) 但这不是延迟加载。

您希望您的 lib 自行创建服务,并且该 lib 不应引用您的 ioc-container autofac。

所以你必须使用 createService<T>releaseService<T> 方法将 autofac 隐藏在 factoryInterface 后面

lib 知道接口

您的 factoryClass 使用 autofac 实现 factoryInterface。

【讨论】:

    猜你喜欢
    • 2021-10-21
    • 1970-01-01
    • 2012-04-23
    • 2019-04-27
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多