来自装配体的类型如何无法解析温莎城堡

时间:2019-04-17 18:27:44

标签: c# dependency-injection castle-windsor assemblies

温莎城堡在通过大会注册后无法解析任何类型

我正在尝试实现一项服务,该服务扫描当前库中的所有'.ddl'扩展名,然后在Assembly Windsor中通过程序集将其注册,但是当我尝试解决时,出现异常消息:'无支持组件服务'。如果我通过Kernel.GetAssignableHandlers进行迭代,则可以看到所有类型都已注册。

1。获取程序集的根名称:

var delimiterIndex = assembly.FullName.IndexOfAny(new[] { '.' });

2。以数组的形式获取所有装配体

return Directory.EnumerateFiles(AppDomain.CurrentDomain.BaseDirectory, "*.*", SearchOption.AllDirectories)
                       .Where(x => Path.GetExtension(x).Equals(".dll", StringComparison.InvariantCultureIgnoreCase))
                         .Where(x => Path.GetFileName(x)
                            .StartsWith(rootAssemblyName, StringComparison.InvariantCultureIgnoreCase)).Select(Assembly.LoadFile).ToArray();

3。在温莎城堡容器中注册每个程序集

Classes.FromAssembly(assembly).Pick().WithServiceBase().WithServiceAllInterfaces().WithServiceSelf().LifestyleTransient()

4。解决

var instance = _container.Resolve<IFoo>();

当出现以下消息时,抛出“ ComponentNotFoundException”:

  

“未找到支持服务Mes.Utils.DBUpgrade.IDBUpgrader的组件”

1 个答案:

答案 0 :(得分:1)

我从未设法在实际代码中找到实际的错误,但是Krzysztof Kozmic建议使用Classes.FromAssemblyNamed代替Classes.FromAssembly,这很有效:D

因此与第3节中显示的相比,原始代码所做的更改如下所示:Classes.FromAssemblyNamed(assembly.FullName).Pick().WithServiceBase().WithServiceAllInterfaces().WithServiceSelf().LifestyleTransient()

我想问题出在某种程度上是我加载程序集的方式,但是温莎城堡可能设法加载了它们

感谢您在评论中提供所有答案和讨论:D