【问题标题】:StructureMap - Ability to replace an assembly at runtimeStructureMap - 能够在运行时替换程序集
【发布时间】: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 我开了一个新问题:stackoverflow.com/questions/7554342/…

标签: c# assemblies ioc-container structuremap appdomain


【解决方案1】:

恐怕您只能加载一个额外的程序集。

来自MSDN

如果不卸载所有程序集,就无法卸载单个程序集 包含它的应用程序域。即使大会去 超出范围,实际的程序集文件将保持加载,直到所有 包含它的应用程序域被卸载。

【讨论】:

  • 我描述的 Web 场景有效,因为据我所知,IIS 发挥了作用。
【解决方案2】:

【讨论】:

  • 我不想更改我的配置。我真的只想在运行时替换一个程序集。只需在运行时复制并粘贴程序集即可覆盖。
  • 程序集被加载到内存中并在运行时锁定,恐怕你没有任何选择,只要更换程序集。硬盘上的版本无论如何都无关紧要,因为它已经从内存加载并运行了。
猜你喜欢
  • 2011-09-23
  • 2011-11-25
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
相关资源
最近更新 更多