【问题标题】:C# LightInject - How to replace an instance in a contain with anotherC# LightInject - 如何用另一个替换包含中的实例
【发布时间】:2017-06-17 12:53:07
【问题描述】:

假设我有 ClassA 和 ClassB 从 IClass 继承。现在我有一个 LightInject 容器并将 ClassA 的实例注册为

ClassA classA = new ClassA();
Helpers.Container.RegisterInstance(typeof(IClass), classA, "Class");

现在我想用 classB 替换 classA

ClassB classB = new ClassB();
Helpers.Container.RegisterInstance(typeof(IClass), classB, "Class");

这样当我尝试获取另一个类中的实例时,可以获取 classB 而不是 classA

(IClass) Helpers.Container.TryGetInstance(typeof(IClass), "Class");

但是,当我尝试获取实例时,我总是得到 classA。我怎么解决这个问题?谢谢。

更新:

我有一个IF语句来控制我要注册哪个实例,比如

if (name == "classA")
{
    ClassA classA = new ClassA();
    Helpers.Container.RegisterInstance(typeof(IClass), classA, "Class");
}
else
{
    ClassB classB = new ClassB();
    Helpers.Container.RegisterInstance(typeof(IClass), classB, "Class");
}

在我的代码中,第一轮,条件为真。因此,我将 classA 注册到容器中。第二轮,条件为假。因此,我希望 classB 将注册到容器中。当我尝试获取实例时,我会在第一轮之后获得 classA,然后在第二轮获得 classB。不过目前的情况是两轮都拿到了classA。

【问题讨论】:

  • 你注释掉了Helpers.Container.RegisterInstance(typeof(IClass), classA, "Class");这一行吗?
  • if (true) 将始终进入第一个分支。什么条件?
  • 这只是一个例子。可以是任何条件,比如 if (name == "classA")
  • 您是否尝试立即从 LifeTimeManager 中删除实例(在您的情况下是 ContainerControlledLifetimeManager)?检索注册var registration = container.Registrations.FirstOrDefault(reg => /*reg.RegisteredType == typeof(IClass) &&*/ reg.LifetimeManagerType == typeof(ContainerControlledLifetimeManager) && reg.Name == "Class");,然后检索registration.LifeTimeManager.RemoveValue(); registration.LifeTimeManager.SetValue(classB)

标签: c# light-inject


【解决方案1】:

我是 LightInject 的作者。

可能是因为您在解决服务后尝试注册服务。没有完整的例子很难说。在 LightInject 存储库中创建一个带有小型复制链接的问题,我们将为您提供帮助

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多