【问题标题】:Autofac - constructor on type 'X' not foundAutofac - 找不到类型“X”的构造函数
【发布时间】:2013-04-30 22:22:26
【问题描述】:

我在尝试将一个依赖项注入我当前正在注册的依赖项时遇到问题。我有一个应用程序,它在启动时启动引导加载程序以从设置文件中读取,然后使用来自该设置文件中特定值的反射创建一个对象。我会试着让代码在这里说话。

设置文件

设置文件是一个普通的旧 XML 文件,它序列化/反序列化为一个名为 BootstrapSettings 的对象,该对象遵循以下合同:

public interface IBootstrapSettings
{
    string Get(string key);
    void Set(string key, string value);
}

在此设置文件中,我有一个特定的密钥,用于标识我打算用于此应用程序的 IEncryptor,目前我可以选择 PlainTextEncryptorTDESEncryptor,后者从设置文件,因此在其构造函数中,我传递了一个 IBootstrapSettings 的实例以从设置文件中读取此密码。目前我正在将IBootstrapSettings 的实例注入每个加密器——即使PlainTextEncryptor 没有使用它。我这样做是因为我必须使用反射创建这个实例,并且不知道如何区分不带参数的构造函数和创建 IEncryptor 类型时的构造函数(但是这个我想是另一个问题)。

IEncryptor 构造函数

以下是我目前拥有的每个IEncryptor 的构造函数。

public sealed class PlainTextEncryptor : IEncryptor
{
    private readonly IBootstrapSettings _bootstrapSettings;

    public PlainTextEncryptor(IBootstrapSettings bootstrapSettings)
    {
        _bootstrapSettings = bootstrapSettings;
    }
}

public sealed class TDESEncryptor : IEncryptor
{
    private readonly IBootstrapSettings _bootstrapSettings;

    public TDESEncryptor(IBootstrapSettings bootstrapSettings)
    {
        _bootstrapSettings = bootstrapSettings;
    }
}

注入

关于我如何设置我的依赖项。我有一个 Autofac 模块,它在创建其他任何东西之前创建引导依赖项 - 它看起来像这样:

public sealed class BootstrapSettingsModule : Autofac.Module
{
    private readonly string _filePath;

    public BootstrapSettingsModule(string filePath)
    {
        _filePath = filePath;
    }

    protected override void Load(ContainerBuilder builder)
    {
        base.Load(builder);

        builder.Register(c => new BootstrapSettings(_bootstrapSettingsPath))
            .As<IBootstrapSettings>()
            .SingleInstance();

        builder.Register(c => (IEncryptor)Activator.CreateInstance(Type.GetType(c.Resolve<IBootstrapSettings>().Get("encryptionprovider")), args: new { bootstrapSettings = c.Resolve<IBootstrapSettings>() }))
            .As<IEncryptor>()
            .SingleInstance();
    }
}

现在执行得很好,当我尝试.Resolve IEncryptor 的实例时出现问题我收到错误Constructor on type 'whatever encryptor type' not found。我认为这是因为 Autofac 无法解析我的 IBootstrapSettings 并且因为我的 IEncryptor 上没有默认的无参数构造函数,所以它很适合。

我对在这里做什么有点茫然,我是否通过将IBootstrapSettings 指定为单个实例做错了......还是我只是不正确理解 Autofac 的绑定?一如既往地感谢任何帮助!

【问题讨论】:

  • 请显示加密器类的构造函数。
  • @DanielHilgarth 更新了构造函数代码。

标签: c# reflection autofac


【解决方案1】:

我不明白你为什么不只是使用 Autofac 的工具。

protected override void Load(ContainerBuilder builder)
{
    base.Load(builder);

    var settings = new BootstrapSettings(_bootstrapSettingsPath);
    builder.RegisterInstance(settings)
        .As<IBootstrapSettings>()
        .SingleInstance();

    var encryptorType = Type.GetType(settings.Get("encryptionprovider"));
    builder.RegisterType(encryptorType)
        .As<IEncryptor>()
        .SingleInstance();
}

这将为您带来额外的优势,即您不需要在每个加密器中都有一个带有IBootstrapSettings 参数的构造函数。只有那些真正使用该参数的人才需要它。

【讨论】:

  • 太棒了!!我是 Autofac 的新手,不知道我可以使用 RegisterType 而不是反射来做我想做的事。这非常有效,非常感谢!它说我可以在 3 分钟内接受作为答案。
猜你喜欢
  • 1970-01-01
  • 2015-05-26
  • 2010-12-12
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多