gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:40:11 25 4
gpt4 key购买 nike

我有一个基本 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com