【问题标题】:How to swap StructureMap named instance?如何交换 StructureMap 命名实例?
【发布时间】:2015-04-14 14:48:00
【问题描述】:

示例代码:

public interface IMyClass
{
    string Name { get; set; }
}

public class MyClass : IMyClass
{
    public string Name { get; set; }
}

public static class Program
{
    public static void Main()
    {
        var container = new Container();

        var class1 = new MyClass() {Name = "class 1"};
        container.Configure(x => x.For<IMyClass>().Use(class1).Named("MyClass"));

        var instance1 = container.TryGetInstance<IMyClass>("MyClass");

        container.EjectAllInstancesOf<IMyClass>();

        var class2 = new MyClass() { Name = "class 2" };

        container.Configure(x => x.For<IMyClass>().Use(class2).Named("MyClass"));

        var instance2 = container.TryGetInstance<IMyClass>("MyClass");

        Console.ReadKey();
    }
}

我希望 instance2 返回 class2,但它返回 class1。示例代码有什么问题吗?我需要做什么才能获得 class2?

【问题讨论】:

  • 我已经在我的笔记本电脑上测试了你的代码。我已经删除了这一行container.EjectAllInstancesOf&lt;IMyClass&gt;();。它给了我一个 class2 的实例。
  • 这不是我得到的。即使我删除了那个电话,我仍然得到 class1。您使用的是哪个版本的 StructureMap?我正在使用 3.1.0.0。谢谢!
  • 根据(过时的)docs EjectAllInstancesOf 只弹出单例实例

标签: c# ioc-container structuremap named-instance


【解决方案1】:

这适用于 SM v2.6.3(返回类 2)。在 SM v3.1.1 上,它没有按预期工作(返回类 1)。看起来这是一个错误,可能是在为 3.0 版重构该区域时引入的。查看调用前后的容器元数据注册:

container.EjectAllInstancesOf&lt;IMyClass&gt;();

注册已清除,但旧实例已解决。单例的缓存问题可能。不管是不是命名实例都是一样的。

关于EjectAllInstancesOf,IMyClass 注册了实例,因此容器将其视为单例,因此使用此方法很有意义。

刚刚使用 v3.1.4 的源代码调试了代码,它按预期工作,所以我建议您从 nuget 获取最新版本,这应该可以工作。

【讨论】:

  • 根据我的测试,似乎未命名实例在 SM 3.1.0.0 中有效,但未命名实例。我刚刚尝试了最新版本 SM 3.1.5.154,命名和未命名都按预期工作。谢谢!
  • @MichaelPi 乐于助人!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多