最近升级到 Castle Windsor 版本 3.2.1 并在尝试解决以前在 Windsor 框架版本 3.0 中未出现的服务时收到错误消息。
IWindsorContainer container = new WindsorContainer();
以下代码不再有效
// Throws component not found exception
InstallerHelper.ProcessAssembliesInBinDirectory(
assembly => container.Register(
Classes
.FromAssembly(assembly)
.BasedOn<IWindsorInstaller>()
.WithService.FromInterface()
.LifestyleSingleton()
));
var installers = container.ResolveAll<IWindsorInstaller>();
container.Install(installers);
// Fails here, is it related to a hashcode mismatch in SimpleTypeEqualityComparer?
var credentialCache = container.Resolve<ICredentialCache>()
// works fine if explicity install installers individually
container.Install(new CredentialsInstaller());
var credentialCache = container.Resolve<ICredentialCache>()
ProcessAssembliesInBinDir 在哪里:
public static void ProcessAssembliesInBinDirectory(Action<Assembly> action)
{
var directoryName = GetDirectoryName();
foreach (var dll in Directory.GetFiles(directoryName, "*.dll"))
{
var fileInfo = new FileInfo(dll);
if (!IgnoreList.Any(x=>fileInfo.Name.StartsWith(x)))
{
var assembly = Assembly.LoadFile(dll);
action(assembly);
}
}
}
凭据安装程序在哪里:
public class CredentialsInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Component.For<ICredentidalCache>()
.ImplementedBy<CredentidalCache>()
.LifestyleSingleton()
);
// This works fine
var credentialCache = container.Resolve<ICredentialCache>()
}
}
类实现
public interface ICredentidalCache {}
public class CredentidalCache : ICredentidalCache{}
- 这是从 MVC 应用程序运行的
- .net 框架 4.5 版
- 凭据安装程序位于网站引用的另一个程序集中
- 使用 Windsor 源,当 typeof(ICredentialCache).GetHashCode() 与注册的相同时,成功尝试解析。出于某种原因,当从安装程序返回时,哈希码已更改为类型。在 SimpleTypeEqualityComparer.GetHashCode(Type obj) 中放入调试行表明对于相同类型的哈希码是不同的。
- 检查调试器内的容器显示 ICredentialCache 已成功安装。
编辑
管理通过手动注册安装程序继续前进,即。不依赖resolve<IwindsorInstaller>()
和使用container.install(new Installer(), ...)
。如果我发现更多,我会更新 SO 问题。