StructureMap - 能够在运行时替换程序集
Posted
技术标签:
【中文标题】StructureMap - 能够在运行时替换程序集【英文标题】:StructureMap - Ability to replace an assembly at runtime 【发布时间】:2011-09-21 19:52:17 【问题描述】:例子:
控制台应用程序:
class Program
static void Main(string[] args)
var calculator = ObjectFactory.GetInstance<ICalculator>();
for (var i = 0; i < 10; i++)
Console.WriteLine(calculator.Calculate(10, 5));
Console.ReadLine();
Console.ReadLine();
组装“接口”:
public interface ICalculator
int Calculate(int a, int b);
组装“实施”:
internal class Calculator : ICalculator
public int Calculate(int a, int b)
return a + b;
程序集“实现”,此程序集将在运行时替换上面的程序集:
internal class Calculator : ICalculator
public int Calculate(int a, int b)
return a * b;
组装“解析器”
For<ICalculator>().Use<Calculator>();
我想在运行时替换具体的实现。这可以通过仅替换旧程序集“实施”的 UpdateService 来完成。
我遇到的问题是程序集“实施”被锁定。我无法替换它。
我必须做什么才能实现这一目标?
IoC 容器是否对我的需求负责,还是我必须构建自己的基础架构?
编辑:
在 Web 环境中,您可以轻松地替换程序集。我已经成功地做到了这一点。
【问题讨论】:
为什么是-1?感谢您不发表评论! 你能解释一下你试图通过在运行时替换一个程序集(或者是你想要替换的一组注册?)来解决的问题吗? 我希望在不关闭它的情况下更新我的应用程序。因此,即我想更新我的 DAL,因为有一个错误,但我的应用程序必须仍然运行。 我强烈建议不要做这样的事情。这几乎不会奏效,并且会出现各种各样的问题。请在 SO 上发布一个特定于这种更新方式的新问题,并询问这是否是一个好主意以及您会遇到什么问题。 @Steven 我开了一个新问题:***.com/questions/7554342/… 【参考方案1】:恐怕您只能加载一个额外的程序集。
来自MSDN:
如果不卸载所有程序集,就无法卸载单个程序集 包含它的应用程序域。即使大会去 超出范围,实际的程序集文件将保持加载,直到所有 包含它的应用程序域被卸载。
【讨论】:
我描述的 Web 场景有效,因为据我所知,IIS 发挥了作用。【参考方案2】:我想这就是你要找的东西:
http://structuremap.net/structuremap/ChangingConfigurationAtRuntime.htm
【讨论】:
我不想更改我的配置。我真的只想在运行时替换一个程序集。只需在运行时复制并粘贴程序集即可覆盖。 程序集被加载到内存中并在运行时锁定,恐怕你没有任何选择,只要更换程序集。硬盘上的版本无论如何都无关紧要,因为它已经从内存加载并运行了。以上是关于StructureMap - 能够在运行时替换程序集的主要内容,如果未能解决你的问题,请参考以下文章
如何使用StructureMap的AutoMocker模拟没有接口的类?
MVC 中的 StructureMap 控制器工厂和空控制器实例