C# 针对非平凡项目依赖项的推荐Windsor体系结构
我们的解决方案中有大约20个独立的项目。每个项目都是一个独立的组件,并有自己的Windsor安装程序。有了这种结构,我们发现我们的温莎安装工变得庞大、难以管理和脆弱 在我们的解决方案中,一些拱形项目依赖于其他较小项目的子集,而一些项目依赖于另一个 结构图类似于此,其中箭头表示依赖关系: 不要纠缠于图表中每个项目的命名。它们只是出于可管理性和重用考虑而分开的不同项目 我可以看到Windor安装的两种方法是:C# 针对非平凡项目依赖项的推荐Windsor体系结构,c#,castle-windsor,C#,Castle Windsor,我们的解决方案中有大约20个独立的项目。每个项目都是一个独立的组件,并有自己的Windsor安装程序。有了这种结构,我们发现我们的温莎安装工变得庞大、难以管理和脆弱 在我们的解决方案中,一些拱形项目依赖于其他较小项目的子集,而一些项目依赖于另一个 结构图类似于此,其中箭头表示依赖关系: 不要纠缠于图表中每个项目的命名。它们只是出于可管理性和重用考虑而分开的不同项目 我可以看到Windor安装的两种方法是: 每个组件都安装其依赖项。在本例中,API的安装程序安装组件A和组件B。同样,组件A的安装
Component.For.OnlyNewServices()
。这是冗长且容易忘记的,并且确实需要应用到每个注册中,以允许应用程序增长和组件重用
第二种方法的缺点是,项目最终需要了解他们不关心的组件,封装被破坏
问题:
通过使用Windsor的内置组件扫描,我优雅地解决了这个问题。每个项目现在只安装项目中定义的组件,不显式安装任何其他安装程序,也不急于从其他程序集中解析组件 API项目包括:
var container = new WindsorContainer();
container.Install(FromAssembly.InThisApplication());
我们的安装程序无法管理的部分原因是,一些安装程序正在进行依赖组件的早期解析。这是一种反模式,强制执行安装程序命令。删除这一需求使得应用程序范围内的安装变得微不足道。对于投票结束此问题的人来说,tl;dr版本是“在Windsor中开发模块而不发生注册冲突的推荐方法”;不是项目:我指的是VisualStudio项目/程序集。在我的示例中,每个“模块”和“组件”都是一个c#类库。我不确定你的链接有什么关系。我非常不愿意要求应用程序的入口点(API项目)有一个单片Windsor安装程序,该安装程序不仅安装其依赖项,而且还安装这些依赖项的依赖项,等等。我不知道马克是不是这样建议的,但对于任何规模的项目来说,如果是这样的话,这似乎都是不切实际的。虽然在某种程度上我能理解。将Windsor安装程序引入到库中会创建对Windsor的多个依赖关系。不过,我对这种折衷很满意。温莎是我们组织中的一员,我们不为外部消费发布库,我更希望在创建对象图时尽可能使用抽象原则。API项目的开发人员只需要知道它依赖于组件A和组件B。其他任何东西都只是噪音。