0

最近升级到 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 问题。

4

2 回答 2

0

这对我来说很好:

public sealed class AppServiceFactory
{
...
 public T Create<T>()
 {
     return (T)container.Resolve(typeof(T));
 }
...
}


AppServiceFactory.Instance.Create<IYourService>();
于 2013-08-25T22:59:12.313 回答
0

问题是由 InstallerHelper 及其加载程序集的方式引起的。这篇 SO 帖子为我指明了正确的方向,

https://stackoverflow.com/a/6675227/564957

本质上,使用 Assembly.LoadFile(string fileName) 加载程序集的方式失败导致问题,将其更改为 Assembly.Load(string assemblyName) 纠正了问题。

@Eric Lippert很好地解释了

[当]通过其路径加载程序集,并且通过其程序集名称加载相同的程序集时...反射将认为来自同一程序集的两次加载的类型是不同的类型。从其路径加载的任何程序集都被认为不同于通过其程序集名称加载的程序集。

于 2013-09-03T23:19:59.717 回答