尝试将一个依赖项注入我当前正在注册的依赖项时遇到问题。我有一个应用程序,它在启动时启动引导加载程序以从设置文件中读取,然后使用来自该设置文件中特定值的反射创建一个对象。我会试着让代码在这里说话。
设置文件
设置文件是一个普通的旧 XML 文件,它序列化/反序列化为一个调用的对象,该对象BootstrapSettings
遵循以下合同:
public interface IBootstrapSettings
{
string Get(string key);
void Set(string key, string value);
}
在此设置文件中,我有一个特定的密钥,用于标识IEncryptor
我打算用于此应用程序的内容,此时我可以选择PlainTextEncryptor
or TDESEncryptor
,后者从设置文件中读取密码,因此在其构造函数中我传递了一个实例ofIBootstrapSettings
从设置文件中读取此密码。目前我正在向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 的绑定?一如既往地感谢任何帮助!