我正在重写我公司的DAO库。由于我们解决方案的特点,我们需要根据客户切换ADO库(Oracle/SQL Server)。 由于静态引用是我们问题的主要来源(f.e.Oracle包来自CI而不是SQL Server)我决定采用插件体系结构,并尝试动态加载所需的dll。Container中的寄存器布尔值
我是新来的简单注射器(我使用Ninject,但在这种情况下,我们需要的东西,真的很快)。我使用了https://simpleinjector.readthedocs.org/en/latest/advanced.html#registering-plugins-dynamically文章,并设法将正确的dll加载到域中。
我货柜验证(container.Verify())期间,我目前正面临着一个奇怪的(在我看来)错误:
型GenericDAO的构造包含布尔类型的参数名为“isInUserContext”没有注册。请确保布尔已注册到容器中,或更改GenericDAO的构造函数。
我的构造看起来像这样:
public class GenericDAO : DBHelper
{
public GenericDAO(Boolean isInUserContext, string connectionString, string providerName, UniversalDataAccess universalDataAccess)
: base(isInUserContext, connectionString, providerName, universalDataAccess)
{
}
我注册:
var pluginDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins");
var pluginAssemblies =
from file in new DirectoryInfo(pluginDirectory).GetFiles()
where file.Extension.ToLower() == ".dll"
select Assembly.LoadFile(file.FullName);
var pluginTypes =
from assembly in pluginAssemblies
from type in assembly.GetExportedTypes()
where typeof (IDBHelper).IsAssignableFrom(type)
where !type.IsAbstract
where !type.IsGenericTypeDefinition
select type;
_kernel.RegisterAll<IDBHelper>(pluginTypes);
你知道如何成功地初始化所有需要的类型? 我想揭示GenericDAO类型的公共属性。
Steven,谢谢你的丰富解释。我会用你的建议。你关于缺失抽象的建议很好,但我太盲目了,看不到它。现在它真的有道理。再次感谢你。 – 2014-11-24 16:50:42