除非在代码中引用程序集,否则Castle.Windsor不会使用FromAssembly.InThisApplication运行安装程序

时间:2012-10-02 00:15:35

标签: dependency-injection castle-windsor

我有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>());

但我希望不必直接引用其他组件。

更新命名空间为:

  • MVC应用是MyApp.OnlineProducts.Service
  • 类库是MyApp.Individuals.Service

4 个答案:

答案 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;
        }
    }

}