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 使用特定的构造函数

如何使用StructureMap的AutoMocker模拟没有接口的类?

MVC 中的 StructureMap 控制器工厂和空控制器实例

在程序运行时实现函数替换

在 Asp.Net MVC 应用程序中使用 Structuremap 将 ISession 注入我的存储库

使用 StructureMap 在 Timer_Elapsed 中处理 Datacontext 操作