C# 使用autofac的实时可重构/可更新(微型)服务的最佳实践?
目前正在考虑如何(重新)设计一个微服务,以支持动态重新配置(XML、Json等)和/或更新(Dll) 我是Autofac的粉丝,我认为它可以用于此 最佳实践是什么?我已经知道更新功能已经过时了 多租户似乎不适用于此 我唯一能想到的是对所有可重构类使用C工厂,然后让这个工厂“决定”新的配置/组件是否可用? 工厂当然是由Autofac控制的 希望有人能给我指出正确的方向 亲切问候,,C# 使用autofac的实时可重构/可更新(微型)服务的最佳实践?,c#,autofac,C#,Autofac,目前正在考虑如何(重新)设计一个微服务,以支持动态重新配置(XML、Json等)和/或更新(Dll) 我是Autofac的粉丝,我认为它可以用于此 最佳实践是什么?我已经知道更新功能已经过时了 多租户似乎不适用于此 我唯一能想到的是对所有可重构类使用C工厂,然后让这个工厂“决定”新的配置/组件是否可用? 工厂当然是由Autofac控制的 希望有人能给我指出正确的方向 亲切问候,, Henry这里面有很多内容,答案很大程度上取决于您的应用程序及其工作方式,因此无法提供具体的答案或指导。最好的人能提
Henry这里面有很多内容,答案很大程度上取决于您的应用程序及其工作方式,因此无法提供具体的答案或指导。最好的人能提供的是关于如何通过DI实现动态事物的建议,并希望您能将这些概念应用到您的应用程序中 你已经注意到了。我鼓励您仔细阅读整个问题,因为顶部对变通方法的描述以及本期后面对个别问题的解决将有所帮助 加载插件程序集 如果应用程序中的程序集在运行时发生更改,则很可能需要重新生成容器。很可能您已经在处理一些事情,比如在子进程中运行插件,以便可以转储和重新加载应用程序域;当在插件中发现不同的依赖版本时,您正在处理程序集绑定问题,等等。插件程序集已经是一个挑战;在运行时更改它是。。。嗯,这是一只非常复杂的野兽 如果您在运行时更改插件程序集,我建议您从头开始重建容器。基本上是重新运行应用程序启动逻辑位来注册内容。这意味着您的插件将使用一个独立的容器,而不是应用程序托管的东西。或者,您可以使用子生命周期范围,动态地注册插件内容,并假装子范围是一个“容器”,但当您开始动态地进行绑定重定向之类的工作时,这也可能会有点麻烦 我为什么说重建
- 依赖项可以更改:如果您添加一个插件,并且依赖项集可以更改,这意味着您可能将错误版本的依赖项加载到容器中,并且您将很难调试出现的错误
- 可枚举性可以改变:如果你有一个类似于“插件管理器”的东西,它是一个单例,并且它解析了所有插件的列表,那么你就改变了它。您需要转储单例并重新创建它。这意味着转储保存单例的生存期范围
- Lambda注册:每次解析都会运行Lambda注册。如果该值在运行时可能会更改,则注册一个lambda,该lambda每次执行配置查找可能就是答案。您将始终获得最新的值
- 在DI之外更改的配置处理程序:处理JSON配置的
位允许JSON配置文件在运行时更改,并在封面下重新加载配置。这不是DI的一部分,这是配置系统的一部分。Microsoft.Extensions.Configuration
接收器还具有提供动态可配置日志过滤器的功能。这也完全超出了DI的范畴。利用这些东西。不要把所有的重量都放在你的IoC容器上Microsoft.Extensions.Logging
一般来说,IoC容器针对解析操作而不是构建操作进行了优化。如果您预计某个区域会出现大量的客户流失,请尝试使用lambda注册或努力避免重建集装箱。感谢您的详细回答,我非常感谢!我指的是优雅地过渡到新版本的组件。是否有支持多个组件/实现版本的IoC容器?那么,不是替换实现而是在它旁边设置一个新的实现?这是一个实际的要求吗?我不确定我是否理解这个问题。。。但是我不知道所有容器的所有特性,所以要弄清楚谁支持你要做的一些研究。是的,我还需要做更多的研究。但我想知道我的要求是可行的还是简单的cra