目前正在考虑如何(重新)设计一个微服务来支持动态重新配置(XML,Json,...)和/或更新(Dll)。
我是Autofac的粉丝,认为它可以用来做这件事。
最佳实践是什么?我已经知道Update函数已经过时了。https://github.com/autofac/Autofac/issues/811
多租户似乎不适用于此?https://autofaccn.readthedocs.io/en/latest/advanced/multitenant.html?highlight=multitenant
我唯一能想到的就是对所有可重构的类使用C#工厂,然后让这个工厂“决定”新的配置/组件是否可用?工厂当然是由Autofac控制的。
希望有人能给我指明正确的方向。
亲切的问候,亨利
发布于 2018-06-03 02:26:19
这里面有很多东西,很多答案实际上取决于你的应用程序和它是如何工作的,所以没有一个具体的答案或指导可以提供。人们能提供的最好的建议就是如何通过依赖注入实现动态事物,并希望你能将这些概念应用到你的应用程序中。
你已经注意到了Update
is obsolete, but there's a lot of guidance in that issue for how to make things more dynamic。我鼓励您仔细阅读整个问题,因为顶部对解决方法的描述以及问题后面的单个问题的解决将会有所帮助。
加载插件程序集
如果应用程序中的程序集集在运行时发生更改,则很可能需要重新构建容器。你可能已经在处理一些事情,比如在子进程中运行插件,以便应用程序域可以转储和重新加载,当插件之间发现不同的依赖版本时,你正在处理程序集绑定问题,等等。插件程序集已经是一个挑战;在运行时更改它是……嗯,这是一个非常复杂的野兽。
在运行时更改插件程序集的情况下,我建议使用从头开始重新构建容器。基本上是重新运行应用程序启动逻辑位来注册内容。这意味着你的插件将使用一个独立的容器,而不是应用程序托管的东西。或者,你可以使用子生命周期作用域并动态注册插件的东西,并假设子作用域是一个“容器”,但当你开始动态绑定重定向之类的东西时,这也可能会变得有点麻烦。
为什么我说重建?
插件依赖项可以改变:如果你添加了一个插件,并且依赖项集可以改变,这意味着你可能有一个错误的依赖项加载到容器中,你会得到难以调试的疯狂错误弹出up.
“但是,”你可能会说,“我没有依赖项版本控制的问题!我强制我的所有插件使用相同的版本!”
“是的,”我会回答说,“这就是为什么没有人能给你具体的指导。这就是为什么可以提出建议,可以提供想法,但这将是100%由你来决定什么是适合你的应用程序。”
更改配置
总的来说,我建议你使用两种可以在运行时更改的配置策略:
Microsoft.Extensions.Configuration
配置的JSON位允许在运行时更改JSON配置文件,并在幕后重新加载配置。这不是DI的一部分,而是配置系统的一部分。Microsoft.Extensions.Logging
接收器也具有此功能,可以提供动态配置的日志过滤器。这也完全超出了DI的范畴。利用这些东西。不要把所有的重量都压在你的IoC容器上。“但是,”你可能会说,“我需要更改影响整个应用程序的东西!我有动态配置,需要更改服务在哪些端口上可用,这会影响整个主机进程!”
“是的,”我会回答,“这将需要更多的自定义编码方式,你必须解决这个问题。它可能需要一个完整的独立容器(一个容器用于‘启动’,一个容器用于‘运行时’)。这将是特定于应用程序的,没有人能为此提供具体的指导。”
多租户
多租户支持对于每个租户都不同的东西来说是很棒的。也许您为每个租户注册了不同的消息处理程序(或其他任何东西)。太棒了。您可以在多租户中使用上述概念,就像在应用程序级别一样简单。您可以在运行时“删除租户作用域”来重新配置它,这是可行的。但请记住,如果这样做,您将必须进行一些锁定,以确保在您重新配置时,针对该租户的请求将被搁置。
Perf注释
一般来说,IoC容器是针对解析操作而不是构建操作进行优化的。如果您预计某个区域会有大量的流失,请尝试使用lambda注册或做一些工作,以避免重新构建容器。
https://stackoverflow.com/questions/50641895
复制相似问题