Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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# 针对非平凡项目依赖项的推荐Windsor体系结构_C#_Castle Windsor - Fatal编程技术网

C# 针对非平凡项目依赖项的推荐Windsor体系结构

C# 针对非平凡项目依赖项的推荐Windsor体系结构,c#,castle-windsor,C#,Castle Windsor,我们的解决方案中有大约20个独立的项目。每个项目都是一个独立的组件,并有自己的Windsor安装程序。有了这种结构,我们发现我们的温莎安装工变得庞大、难以管理和脆弱 在我们的解决方案中,一些拱形项目依赖于其他较小项目的子集,而一些项目依赖于另一个 结构图类似于此,其中箭头表示依赖关系: 不要纠缠于图表中每个项目的命名。它们只是出于可管理性和重用考虑而分开的不同项目 我可以看到Windor安装的两种方法是: 每个组件都安装其依赖项。在本例中,API的安装程序安装组件A和组件B。同样,组件A的安装

我们的解决方案中有大约20个独立的项目。每个项目都是一个独立的组件,并有自己的Windsor安装程序。有了这种结构,我们发现我们的温莎安装工变得庞大、难以管理和脆弱

在我们的解决方案中,一些拱形项目依赖于其他较小项目的子集,而一些项目依赖于另一个

结构图类似于此,其中箭头表示依赖关系:

不要纠缠于图表中每个项目的命名。它们只是出于可管理性和重用考虑而分开的不同项目

我可以看到Windor安装的两种方法是:

  • 每个组件都安装其依赖项。在本例中,API的安装程序安装组件A和组件B。同样,组件A的安装程序安装模块A和模块B,组件B的安装程序安装模块B和模块C。这是我的首选解决方案,因为它提供了整洁的封装

  • 顶级项目将安装解决方案中的所有依赖项。在本例中,API的安装程序同时安装组件A和组件B以及所有三个模块

  • 第一种方法的缺点是,可能安装多次的每个安装程序在每次注册时都需要使用
    Component.For.OnlyNewServices()
    。这是冗长且容易忘记的,并且确实需要应用到每个注册中,以允许应用程序增长和组件重用

    第二种方法的缺点是,项目最终需要了解他们不关心的组件,封装被破坏

    问题:

  • 温莎有没有办法设置默认行为,以便组件可以多次注册

  • 或者,对于非平凡依赖项(例如,子容器),是否有其他一些推荐的Windsor体系结构


  • 通过使用Windsor的内置组件扫描,我优雅地解决了这个问题。每个项目现在只安装项目中定义的组件,不显式安装任何其他安装程序,也不急于从其他程序集中解析组件

    API项目包括:

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

    我们的安装程序无法管理的部分原因是,一些安装程序正在进行依赖组件的早期解析。这是一种反模式,强制执行安装程序命令。删除这一需求使得应用程序范围内的安装变得微不足道。

    对于投票结束此问题的人来说,tl;dr版本是“在Windsor中开发模块而不发生注册冲突的推荐方法”;不是项目:我指的是VisualStudio项目/程序集。在我的示例中,每个“模块”和“组件”都是一个c#类库。我不确定你的链接有什么关系。我非常不愿意要求应用程序的入口点(API项目)有一个单片Windsor安装程序,该安装程序不仅安装其依赖项,而且还安装这些依赖项的依赖项,等等。我不知道马克是不是这样建议的,但对于任何规模的项目来说,如果是这样的话,这似乎都是不切实际的。虽然在某种程度上我能理解。将Windsor安装程序引入到库中会创建对Windsor的多个依赖关系。不过,我对这种折衷很满意。温莎是我们组织中的一员,我们不为外部消费发布库,我更希望在创建对象图时尽可能使用抽象原则。API项目的开发人员只需要知道它依赖于组件A和组件B。其他任何东西都只是噪音。