在使用Castle.Windsor时,需要根据当前应用的目录注册Assembly, 示例代码如下:
private static void Registe()
{
if (container == null)
{
var assemblyDir = System.Environment.CurrentDirectory;
container = new WindsorContainer();
container.Install(
FromAssembly.InDirectory(new AssemblyFilter(assemblyDir))
);
container.Register(Classes.FromAssemblyInDirectory(new AssemblyFilter(assemblyDir)).BasedOn(typeof(IEntryCreator)).WithService.Base());
container.Register(Classes.FromAssemblyInDirectory(new AssemblyFilter(assemblyDir)).BasedOn(typeof(IQuery)).WithService.Base());
container.Register(Classes.FromAssemblyInDirectory(new AssemblyFilter(assemblyDir)).BasedOn(typeof(IDataCommand)).WithService.Base());
}
}
代码在单元测试环境下可以正常运行,可是转移到Asp.Net环境下,出现了组件没有注册的错误,跟踪代码发现,System.Environment.CurrentDirectory没有指向当前应用的bin目录,而是指向IISExpress目录。将代码修改为:
var assemblyDir = AppDomain.CurrentDomain.BaseDirectory+"\\bin";
可以在Asp.Net下运行了,可是单元测试运行出现了问题,发现AppDomain.CurrentDomain.BaseDirectory已经指向bin\debug目录,不需要后面的bin,试了其它几种获取的方法,都不成功,最后只能用比较笨的办法,判断路径中是否包含\bin子目录,如果没有则增加:
var assemblyDir = AppDomain.CurrentDomain.BaseDirectory;
if(!assemblyDir.ToLower().Contains("\\bin")) assemblyDir = AppDomain.CurrentDomain.BaseDirectory +"\\bin";
这不是个完美的解决办法:如果自定义的输出目录不在bin目录下,还是会出现错误。不过对于目前的项目需求是够用了。