C# Autofac-类型为'的构造函数;X';找不到

C# Autofac-类型为'的构造函数;X';找不到,c#,reflection,autofac,C#,Reflection,Autofac,我在尝试将一个依赖项注入当前注册的依赖项时遇到问题。我有一个应用程序,在启动init时,引导加载程序从设置文件读取,然后使用此设置文件中特定值的反射创建对象。我会试着让代码在这里说话 设置文件 设置文件是一个普通的旧XML文件,它序列化/反序列化到一个名为BootstrapSettings的对象,该对象遵循以下约定: public interface IBootstrapSettings { string Get(string key); void Set(string key,

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

设置文件

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

public interface IBootstrapSettings
{
    string Get(string key);
    void Set(string key, string value);
}
在此设置文件中,我有一个特定的密钥,用于标识我打算用于此应用程序的
加密机
,目前我可以选择
明文加密机
TDESEncryptor
,后者从设置文件中读取一个密码短语,因此在其构造函数中,我将传递一个
IBootstrapSettings
的实例,以从设置文件中读取该密码短语。目前,我正在将
IBootstrapSettings
的一个实例注入到每个加密机中,即使
plaintextconcryptor
不使用它。我这样做是因为我必须使用反射来创建这个实例,并且不知道如何区分不接受参数的构造函数和创建
encyryptor
类型时接受参数的构造函数(但我想这是另一个问题)

i寄存器构造函数

下面是我目前拥有的每个
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();
    }
}
公共密封类bootstrapsettingmodule:Autofac.Module
{
私有只读字符串\u文件路径;
公共引导设置模块(字符串文件路径)
{
_filePath=filePath;
}
受保护的覆盖无效负载(ContainerBuilder builder)
{
基础荷载(建筑商);
寄存器(c=>newbootstrapsettings(_bootstrapsettingpath))
.As()
.SingleInstance();
builder.Register(c=>(encyryptor)Activator.CreateInstance(Type.GetType(c.Resolve().Get(“encryptionprovider”)),args:new{bootstrapSettings=c.Resolve()}))
.As()
.SingleInstance();
}
}
现在它执行得很好,当我尝试
解决
一个
IEncryptor
的实例时,问题就出现了。我得到的错误是未找到类型“which encryptor type”的构造函数。我假设这是因为Autofac无法解析我的
IBootstrapSettings
,并且因为我的
IEncryptor
上没有默认的无参数构造函数,所以这是一个错误


我有点不知所措,在这里该怎么做,我把
IBootstrapSettings
指定为一个实例是否做错了什么。。。或者我只是没有正确理解Autofac的绑定?一如既往地感谢任何帮助

我不明白你为什么不使用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();
}
protected override void Load(ContainerBuilder生成器)
{
基础荷载(建筑商);
var设置=新的BootstrapSettings(_bootstrapsettingpath);
生成器注册表状态(设置)
.As()
.SingleInstance();
var encryptorType=Type.GetType(settings.Get(“encryptionprovider”);
builder.RegisterType(encryptorType)
.As()
.SingleInstance();
}

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

请显示加密器类的构造函数。@DanielHilgarth用构造函数代码更新。非常好!!我是Autofac的新手,不知道我可以使用
RegisterType
而不是反射来做我想做的事情。这很好用,非常感谢!它说我可以在3分钟内接受答案,所以我会这样做。