Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向castle windsor注册来自未引用程序集的类_C#_Castle Windsor - Fatal编程技术网

C# 向castle windsor注册来自未引用程序集的类

C# 向castle windsor注册来自未引用程序集的类,c#,castle-windsor,C#,Castle Windsor,我已经将我所有的温莎安装程序与他们自己的IOC组件解耦。可以像这样从未引用的程序集中注册类型 container.Register( Classes .FromAssemblyNamed("MyProject.Web") .BasedOn<IController>() .LifestylePerWebRequest(), Classes .FromAssemblyNamed("MyProject.Web

我已经将我所有的温莎安装程序与他们自己的IOC组件解耦。可以像这样从未引用的程序集中注册类型

container.Register(
    Classes
        .FromAssemblyNamed("MyProject.Web")
        .BasedOn<IController>()
        .LifestylePerWebRequest(),

    Classes
        .FromAssemblyNamed("MyProject.Web")
        .BasedOn<IBaseHttpModule>()
        .LifestylePerWebRequest()
    );
container.Register(
班级
.FromAssemblyNamed(“MyProject.Web”)
.BasedOn()
.LifestylePerWebRequest(),
班级
.FromAssemblyNamed(“MyProject.Web”)
.BasedOn()
.LifestylePerWebRequest()
);
目前这对我来说还不错,但我想明确说明模块注册的顺序

我尝试了以下方法,但发现这无法工作,因为我的IOC dll中无法引用MyProject.Web,因为这将创建循环依赖关系

        container.Register(
            Component
                .For<IBaseHttpModule>()
                .ImplementedBy(Type.GetType("MyProject.Web.Modules.AuthenticationModule, MyProject.Web"))
                .LifestylePerWebRequest()
                );
container.Register(
组成部分
.对于()
.ImplementedBy(Type.GetType(“MyProject.Web.Modules.AuthenticationModule,MyProject.Web”))
.LifestylePerWebRequest()
);

有没有办法让这类东西在windsor上使用?我在对象浏览器中搜索了文档和DLL,但没有找到任何看起来像是我的解决方案的东西。

使用控制注册顺序。

您尝试过类似的方法吗

container.Register(
Classes
    .FromAssemblyNamed("MyProject.Web").Where(t => t.FullName == "MyProject.Web.Modules.AuthenticationModule").
    .BasedOn<IBaseHttpModule>()
    .LifestylePerWebRequest()
container.Register(
班级
.FromAssemblyName(“MyProject.Web”)。其中(t=>t.FullName==“MyProject.Web.Modules.AuthenticationModule”)。
.BasedOn()
.LifestylePerWebRequest()

您可以在未引用的程序集中创建一个安装程序,然后让Castle Windsor按如下方式拾取它:

container.Install(FromAssembly.Named("MyProject.Web"));

我认为这是一种更干净的方法,因为你不需要在另一个程序集中注册实现,它们自己做。

是的,我打赌这会起作用。我已经做过这样的事情来选择所有以服务结束的类。谢谢!我测试它时会标记为正确。我接受你的观点,但我讨厌所有的安装程序这也是我过去做过的事情。这意味着每个组件都有自己的“温莎安装程序”并负责在IoC要求时自行安装。我非常喜欢安装程序位于实现旁边的事实。这也意味着如果您与完全不同的团队共享组件/模块,则其中会附带特定的温莎安装程序。如果您愿意,可自行安装。但尼尔的观点仍然有效,这可能是一个p问题参考资料。