首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用autofac的动态可重构/可更新(微)服务的最佳实践?

使用autofac的动态可重构/可更新(微)服务的最佳实践?
EN

Stack Overflow用户
提问于 2018-06-01 18:55:30
回答 1查看 98关注 0票数 -1

目前正在考虑如何(重新)设计一个微服务来支持动态重新配置(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控制的。

希望有人能给我指明正确的方向。

亲切的问候,亨利

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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.

  • Enumerables
  • 改变:如果你有一个像“插件管理器”这样的东西,它是一个单例,它解析所有插件的列表,你只是改变了它。您需要转储单例并重新创建它。这意味着转储包含单例的生存期范围。

“但是,”你可能会说,“我没有依赖项版本控制的问题!我强制我的所有插件使用相同的版本!”

“是的,”我会回答说,“这就是为什么没有人能给你具体的指导。这就是为什么可以提出建议,可以提供想法,但这将是100%由你来决定什么是适合你的应用程序。”

更改配置

总的来说,我建议你使用两种可以在运行时更改的配置策略:

  • Lambda注册: Lambda注册在每次解析时都会运行。如果该值可能在运行时发生变化,那么注册一个每次执行配置查找的lambda可能是答案。您将始终获得在DI外部更改的最新value.
  • Configuration处理程序:处理Microsoft.Extensions.Configuration配置的JSON位允许在运行时更改JSON配置文件,并在幕后重新加载配置。这不是DI的一部分,而是配置系统的一部分。Microsoft.Extensions.Logging接收器也具有此功能,可以提供动态配置的日志过滤器。这也完全超出了DI的范畴。利用这些东西。不要把所有的重量都压在你的IoC容器上。

“但是,”你可能会说,“我需要更改影响整个应用程序的东西!我有动态配置,需要更改服务在哪些端口上可用,这会影响整个主机进程!”

“是的,”我会回答,“这将需要更多的自定义编码方式,你必须解决这个问题。它可能需要一个完整的独立容器(一个容器用于‘启动’,一个容器用于‘运行时’)。这将是特定于应用程序的,没有人能为此提供具体的指导。”

多租户

多租户支持对于每个租户都不同的东西来说是很棒的。也许您为每个租户注册了不同的消息处理程序(或其他任何东西)。太棒了。您可以在多租户中使用上述概念,就像在应用程序级别一样简单。您可以在运行时“删除租户作用域”来重新配置它,这是可行的。但请记住,如果这样做,您将必须进行一些锁定,以确保在您重新配置时,针对该租户的请求将被搁置。

Perf注释

一般来说,IoC容器是针对解析操作而不是构建操作进行优化的。如果您预计某个区域会有大量的流失,请尝试使用lambda注册或做一些工作,以避免重新构建容器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50641895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档