MEF 和单独的接口组装导致“每个类的接口”

2023-11-21

我特别熟悉 DI/IoC 和 MEF。

我有一个 Web 应用程序,它有两种类型的部分(也许有一天会更多),这些部分由需要访问整个环境的接口定义。该应用程序有一个由 MEF 组成的列表,其中包含每种类型的具体实现。

环境包括:

  • 几个存储库
  • 当前的申请请求
  • 渲染引擎
  • 导航引擎
  • 加上一些静态实用程序类

如何将接口定义放在单独的程序集中,同时指定环境注入?

显然,我不能只引用主程序集,因为它需要引用合同程序集,并且我无法创建循环引用。

看来我需要为每个环境类及其公开可用的类型等创建一个接口...必须有更好的方法吗?!

也许我还错过了这里明显的更大缺陷,如果有人能为我指出吗?


如果您想将抽象与实现分离(始终是一个有价值的目标),则应该在它们自己的程序集中定义这些抽象。

从实现方面来看,这很容易处理,因为您需要引用抽象来实现它们。无论你是否使用 MEF,都没有办法解决这个问题,所以一直都是这样:

[Import(typeof(IFoo))]
public class MyFoo : IFoo { }

但是,正如您所说,这意味着您无法引用您的成分根来自抽象库。然而,这是应该的,因为抽象不应该担心它们是如何组合的。

换句话说,您必须在抽象库之外实现依赖项的组合。可执行文件本身是一个很好的选择,而您可以将所有具体实现保存在一个或单独的库中。

抽象库将没有引用,而消费者和实现者都需要引用它,因此依赖关系图可能如下所示:

Composition Root --> Abstractions <-- Implementations

其中箭头表示参考。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MEF 和单独的接口组装导致“每个类的接口” 的相关文章

  • 私有只读接口 - 它是多余的吗?

    我在我的项目中使用 IoC 和 DI 但是我想知道以下是否是一个好的做法 private readonly IMyService myservice 作为服务使用者的类内的字段 该字段在构造函数中设置 我确信我在某处见过这个并且我已经注意到
  • 在ConfigureServices中注入依赖

    在我的 ASP Net Core 应用程序中 我需要在以下位置注入一些依赖项 在我的例子中是一个存储库 ConfigureServices method 问题是该方法不允许使用多个参数来注入依赖项 该怎么办呢 这是我的代码 public v
  • 按类型进行弹簧接线比按名称接线要慢很多

    在我的项目中 我试图迁移 Foo foo Foo beanFactory getBean name into Foo foo beanFactory getBean Foo class 好处是显而易见的 类型安全 更少复杂的代码 更少无用的
  • C# 继承

    假设我有以下代码 interface ISomeInterface void DoSomething void A void B public abstract class ASomeAbstractImpl ISomeInterface
  • java中什么是静态接口?

    我正在阅读Map Entry界面 当我注意到它是一个static界面 我不太明白什么是静态接口 它与常规接口有什么不同 public static interface Map Entry
  • 如何使用 Laravel IoC 将数据库注入构造函数

    我想使用 DB 类与 IoC 容器进行事务处理 use Illuminate Database Connection as DB public function construct DB db this gt db db 但是当使用 db
  • DI Control-Freak 反模式:难以理解

    我正在阅读 Mark Seemann 写的 NET 中的依赖注入 但我无论如何也无法理解这一点 虽然new当涉及到 VOLATILE 时 关键字是一种代码味道 依赖性 您无需担心将其用于稳定 依赖性 这new一般来说 关键字不会突然变得 非
  • InvalidOperationException:无法解析类型“Microsoft.AspNetCore.Http.IHttpContextAccessor”的服务

    我开始将我的 asp net core RC1 项目转换为 RC2 并面临现在的问题IHttpContextAccessor没有解决 为了简单起见 我使用 Visual Studio 模板创建了新的 ASP NET RC2 项目ASP NE
  • Ninject Providers -> 在提供程序中获取另一个依赖项

    我想知道这里的最佳实践是什么 我需要为我的多租户应用程序构建一个 DbContext 因此我创建了一个如下所示的依赖项提供程序 public class TenantContextFactoryProvider Provider
  • 如何使“CustomExecutionContext”可用于 Play 2.6 控制器中的依赖项注入?

    我正在跟随Play 2 6 的 Scala 文档和示例代码用于创建非阻塞操作 https www playframework com documentation 2 6 x ScalaAsync Creating non blocking
  • 何时使用依赖注入

    最近几天我有一种感觉 依赖注入真的应该被称为 我无法下定决心 模式 我知道这可能听起来很愚蠢 但实际上这是我应该使用依赖注入 DI 背后的原因 人们经常说我应该使用 DI 来实现更高级别的松耦合 我明白了 但实际上 一旦我选择了 MS SQ
  • TypeScript 是否可以从动态对象推断键?

    我在这里想要实现的是从数组生成的对象的智能感知 自动完成 类似于 Redux 的 Action Creator 一个字符串数组 string 可以简化为具有形状的对象 string string 例如 const a ONE TWO THR
  • 使用 DI 进行单元测试和模拟服务

    我已经为此苦苦挣扎了一段时间 希望有人能提供帮助 我有一个使用服务来获取数据的组件 我正在尝试向其添加单元测试 我的问题是测试总是失败并显示 错误 没有 Http 提供程序 这是我的代码 Service import Injectable
  • 我可以使用从 Java 实现 java 接口的 scala 类吗?

    我正在学习 Scala 很好奇是否可以 创建一个在 Scala 中实现 Java 接口的对象 将对象编译成类文件并将其打包 使用 Java 中的对象 我想在 scala 中实现一个自定义的 lucene 查询解析器 并能够让其他人从 jav
  • char 的符号是接口问题吗?

    假设我有一个函数 void foo char 它在内部需要将其输入视为以 NUL 结尾的字节块 例如 它是字符串上的哈希函数 我可以把论点转为unsigned char 在函数中 我还可以将声明更改为 void foo unsigned c
  • 为什么Java中没有多重继承,但允许实现多个接口?

    Java 不允许多重继承 但它允许实现多个接口 为什么 因为接口只指定what班级正在做 而不是how它正在这样做 多重继承的问题是两个类可能定义不同的方式做同样的事情 并且子类无法选择选择哪一个
  • Castle.Windsor可以自动解析具体类型吗

    我们正在评估 C 项目的 IoC 容器 Unity 和 Castle Windsor 都表现出色 我喜欢 Unity 的一件事 NInject 和 StructureMap 也这样做 是 显而易见如何构造它们的类型不必向 IoC 容器注册
  • 如何强制 Unity 创建一个新实例?

    使用 Unity 应用程序块 当我们调用时 如何强制 Unity 配置创建对象的新实例UnityContainer Resolve
  • 使用 Unity 在构造函数中使用属性依赖注入

    好的 我在基类中定义了一个依赖属性 我尝试在其派生类的构造函数内部使用它 但这不起作用 该属性显示为 null Unity 在使用 container Resolve 解析实例后解析依赖属性 我的另一种选择是将 IUnityContaine
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed

随机推荐