asp.net-mvc - 带有构造函数注入(inject)和 MEF 的 Asp.net MVC 基本 Controller

标签 asp.net-mvc dependency-injection mef constructor-injection

我有一个基本 Controller 类,它向它的子类公开一些日志记录功能。此日志记录依赖项是构造函数注入(inject)的。为了提供一些简化的代码,这就是它的样子:

public abstract class LogControllerBase : Controller
{
    private readonly ILogger logger = null;

    protected LogControllerBase(ILogger logger)
    {
        this.logger = logger;
    }
}

我的子 Controller 也有自己的依赖项,因此它们看起来像这样:
public class SomeController : LogControllerBase
{
    private readonly IService service = null;

    [ImportingConstructor]
    public SomeController(ILogger logger, IService service)
        : base(logger)
    {
        this.service = service;
    }
}

我正在使用这些构造函数来轻松地在我的单元测试中进行依赖注入(inject),但在生产中,所有组合都(应该)由 MEF 完成。我正在使用我的自定义 Controller 工厂类,它使用 MEF 来实例化 Controller 。

总结一下:
  • 我有一个基本的抽象 Controller 类,它有自己的依赖项
  • 我有后代 Controller 使用导入来获取 MEF 注入(inject)的参数(即它们的依赖项以及基类的依赖项)
  • 单元测试不使用 MEF,因此将模拟注入(inject)到构造函数参数

  • 问题

    这一切对我来说都成立,但 MEF 的想法不同。当我编译并运行这段代码时,我得到了这个异常:

    GetExportedValue cannot be called before prerequisite import 'SomeController..ctor (Parameter="logger", ContractName="ILogger")' has been set.



    所有用作构造函数参数的接口(interface)类型都具有属性 InheritedExport设置它们并且也有具体的实现,所以它应该按预期工作。

    不同的工作替代方案

    当我通过直接在这些私有(private)字段上进行导入来尝试另一种方法时,一切似乎都很好。
    public abstract class LogControllerBase : ControllerBase
    {
        [Import]
        private ILogger logger = null;
    
        protected LogControllerBase() { }
    }
    
    public class SomeController : LogControllerBase
    {
        [Import]
        private IService service = null;
    
        public SomeController() { }
    }
    

    所以这可行,但不一样......我可以在这里添加构造函数以进行依赖注入(inject),但是我会有两组构造函数,并且在进行单元测试时可能会使用无参数构造函数,这当然是错误的,因为没有依赖关系会得到设置。不是真实的,也不是模拟的。

    问题

    如何通过将依赖注入(inject)构造函数设置为 ImportingConstructor 在构造函数中注入(inject)具体实现来说服 MEF 创建我的 Controller ?

    最佳答案

    这可能与线程有关,因为默认情况下 MEF 容器不是线程安全的。在容器的构造函数中,尝试启用线程安全:

    var container = new CompositionContainer(catalog, true);
    

    关于asp.net-mvc - 带有构造函数注入(inject)和 MEF 的 Asp.net MVC 基本 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11467386/

    相关文章:

    c# - 我在哪里可以了解 MEF?

    asp.net-mvc - 如何检测不显眼的验证是否成功?

    asp.net-mvc - MVC .NET如何在现有源代码中添加单元测试项目?

    c# - 以 HTML 呈现时在末尾添加空格

    c# - DI 设计模式的值对象是否有效依赖?

    c# - 使用 MEF 的多线程 EF

    c# - 在不同的远程机器上使用 StateServer 模式时出现问题

    java - 编译时编织并在构造函数上 Autowiring

    android - 使用来自多个模块 dagger 2.11 android 的依赖项

    c# - 试图找出此 MEF 组合错误的含义