我有2个项目,一个是MVC网站,另一个是类库。 MVC站点引用类库。
我在MVC站点和类库中有IWindsorInstaller
的实现。 MVC站点中没有直接引用类库中定义的任何类的代码,它们都是在其他地方定义的接口的实现。
在MVC网站中,在app开始我正常做
var container = new Castle.Windsor.WindsorContainer();
container.Install(FromAssembly.InThisApplication());
这不会调用类库中的安装程序。但是,如果我这样做
container.Install(FromAssembly.Containing<ClassFromTheClassLibrary>());
安装程序被调用两次。似乎Castle需要对InThisApplication
的其他程序集进行实际的代码内引用才能获取它。我可以通过这样做解决这个问题:
container.Install(FromAssembly.This());
container.Install(FromAssembly.Containing<ClassFromTheClassLibrary>());
但我希望不必直接引用其他组件。
更新命名空间为:
答案 0 :(得分:2)
如果按照所需的命名约定命名程序集,这应该有效。如果您的主应用程序程序集名称是MyApp.exe,您应该命名其他类库,如MyApp。*。dll(例如,FirstClassLibrary.Whatever.dll和MyApp.SecondClassLibrary.dll),Windsor将选择所有相关的库,这些库都遵循命名惯例。请参阅有关此行为的Windsor文档的this page。
答案 1 :(得分:2)
FromAssembly.InThisApplication()使用调用程序集作为前缀匹配程序集。从MyApp.dll调用将匹配MyApp.Core.dll&amp; MyApp.Stuff.dll。
那么,重命名你的类库可能是一个选择吗?
否则,您可能想要使用:
FromAssembly.InDirectory(新的AssemblyFilter(“c:\ dir”,“*。dll”))
找到你的“组件组件”。
==更新== 我的评论具有误导性。
FromAssembly.InThisApplication()仅处理从调用程序集引用的程序集。
答案 2 :(得分:0)
在此处的其他答案之后,在构建Web app / wcf服务时,请确保该类调用
var container = new Castle.Windsor.WindsorContainer();
container.Install(FromAssembly.InThisApplication());
不在App_Code文件夹中。这是一个容易犯的错误,因为Windsor引导过程依赖于AppInitialize()
方法在App_Code中的某个位置,但在App_Code文件夹中具有实际的引导代码使其存在于单独的App_Code程序集中,从而破坏了程序集这里提到的前缀转换。
答案 3 :(得分:0)
要获取当前正在执行的程序集,请遵循另一个答案。
public class ServiceIoC
{
private static IWindsorContainer _container;
private static int initstatus = 0;
public static IWindsorContainer Container
{
get
{
if (_container == null && initstatus == 0)
{
initstatus = 1;
_container = new WindsorContainer();
_container.Install(FromAssembly.InThisApplication(Assembly.GetExecutingAssembly()));
}
return _container;
}
}
}