2

我有 2 个项目,一个是 MVC 站点,另一个是类库。MVC 站点引用了类库。

IWindsorInstaller我在 MVC 站点和类库中有一个实现。MVC 站点中没有直接引用类库中定义的任何类的代码,它们都是在别处定义的接口的实现。

在 MVC 站点中,在应用程序启动中我正在做通常的事情

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

4 回答 4

2

如果您按照所需的命名约定命名程序集,这应该可以工作。如果您的主应用程序程序集名称是 MyApp.exe,则应将其他类库命名为 MyApp.*.dll(例如 FirstClassLibrary.Whatever.dll 和 MyApp.SecondClassLibrary.dll),Windsor 将选取所有遵守命名的相关库惯例。请参阅解释此行为的 Windsor 文档中的此页面。

于 2012-10-02T00:38:31.760 回答
2

FromAssembly.InThisApplication() 匹配使用调用程序集作为前缀的程序集。从 MyApp.dll 调用将匹配 MyApp.Core.dll 和 MyApp.Stuff.dll。

那么,重命名您的类库可能是一种选择吗?

否则,您可能希望使用: FromAssembly.InDirectory(new AssemblyFilter("c:\dir","*.dll"))
来定位您的“组件程序集”。

== 更新 == 我的评论具有误导性。

FromAssembly.InThisApplication() 仅遍历调用程序集引用的程序集。

于 2012-10-02T00:42:30.137 回答
0

按照此处的其他答案,在构建 Web 应用程序/wcf 服务时,请确保类调用

var container = new Castle.Windsor.WindsorContainer();
container.Install(FromAssembly.InThisApplication());

不在 App_Code 文件夹中。这是一个容易犯的错误,因为 Windsor 引导过程依赖AppInitialize()于 App_Code 中某个位置的方法,但是在 App_Code 文件夹中拥有实际的引导代码会使其存在于单独的 App_Code 程序集中,从而破坏了此处提到的程序集前缀转换。

于 2015-06-26T09:18:02.760 回答
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;
        }
    }

}
于 2019-03-05T06:23:06.350 回答