Dependency injection Windsor不会使用FromAssembly.Inthis应用程序运行安装程序,除非代码中引用了该程序集

Dependency injection Windsor不会使用FromAssembly.Inthis应用程序运行安装程序,除非代码中引用了该程序集,dependency-injection,castle-windsor,Dependency Injection,Castle Windsor,我有两个项目,一个是MVC站点,另一个是类库。MVC站点引用类库 我在MVC站点和类库中实现了IWindsorInstaller。MVC站点中没有直接引用类库中定义的任何类的代码,它们都是在别处定义的接口的实现 在MVC站点中,应用程序内启动我正在做通常的事情 var container = new Castle.Windsor.WindsorContainer(); container.Install(FromAssembly.InThisApplication()); 这不会调用类库中的安

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

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

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

var container = new Castle.Windsor.WindsorContainer();
container.Install(FromAssembly.InThisApplication());
这不会调用类库中的安装程序。但是如果我这样做

container.Install(FromAssembly.Containing<ClassFromTheClassLibrary>());
但我希望不必直接提及其他大会

更新名称空间包括:

MVC应用程序是MyApp.OnlineProducts.Service 类库是MyApp.personals.Service
如果您按照所需的命名约定命名程序集,则应该可以使用此方法。如果主应用程序程序程序集名称为MyApp.exe,则应命名其他类库,如MyApp.*.dll,例如FirstClassLibrary.whater.dll和MyApp.SecondClassLibrary.dll,Windsor将选择遵守命名约定的所有相关类库。请参阅Windsor文档中解释此行为的部分。

如果您按照所需的命名约定命名程序集,则此功能应该可以使用。如果主应用程序程序程序集名称为MyApp.exe,则应命名其他类库,如MyApp.*.dll,例如FirstClassLibrary.whater.dll和MyApp.SecondClassLibrary.dll,Windsor将选择遵守命名约定的所有相关类库。请参阅Windsor文档中解释此行为的部分。

FromAssembly.int此应用程序使用调用程序集作为前缀匹配程序集。从MyApp.dll调用将匹配MyApp.Core.dll和MyApp.Stuff.dll

那么,重命名类库可能是一种选择

否则,您可能需要使用: FromAssembly.InDirectorynew AssemblyFilterc:\dir,*.dll 以查找零部件部件

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


FromAssembly.Inthis应用程序仅遍历从调用程序集引用的程序集。

FromAssembly.Inthis应用程序使用调用程序集作为前缀匹配程序集。从MyApp.dll调用将匹配MyApp.Core.dll和MyApp.Stuff.dll

那么,重命名类库可能是一种选择

否则,您可能需要使用: FromAssembly.InDirectorynew AssemblyFilterc:\dir,*.dll 以查找零部件部件

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


FromAssembly.int此应用程序仅遍历从调用程序集引用的程序集。

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

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

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

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

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

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

要获取当前正在执行的程序集,请按照另一个答案进行操作

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

}

要获取当前正在执行的程序集,请按照另一个答案进行操作

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

}

那么,当我在代码中添加对程序集的引用时,为什么它会起作用呢?您需要确定哪些程序集可以找到iwindsorInstaller。包含只是查找程序集的另一种方法。您需要定义如何找到程序集。如果您想要零代码引用,那么使用dir&filename模式几乎是唯一的方法。但是当两个程序集的名称的第一部分相同时,该应用程序不应该工作吗?您已经列出了名称空间,仔细检查程序集名称。匹配基于调用FromAssembly.InThisApplication的程序集的assembly.FullName。那么,当我在代码中添加对程序集的引用时,为什么会起作用呢?您需要确定要查找iWindsorInstaller的程序集。包含只是查找程序集的另一种方法。您需要定义如何找到程序集。如果您想要零代码引用,那么使用dir&filename模式几乎是唯一的方法。但是当两个程序集的名称的第一部分相同时,该应用程序不应该工作吗?您已经列出了名称空间,仔细检查程序集名称。匹配基于调用FromAssembly.Inthis应用程序的程序集的assembly.FullName。