gpt4 book ai didi

c# - 如何使用传递给构造函数的新实例覆盖已在 LightInject 中注册的类型?

转载 作者:行者123 更新时间:2023-11-30 16:57:33 25 4
gpt4 key购买 nike

在存储库中,我保留了一些实例,这些实例贯穿我的应用程序的整个生命周期,但有时我需要立即用另一个实例和 LightInject 替换此类实例,即使将新实例传递给容器。GetInstance 构造函数覆盖也是如此。

这是显示问题的片段:

    internal class ClassA
{
public string Name { get; private set; }

public ClassA(string name)
{
Name = name;
}

public override string ToString()
{
return Name;
}
}

internal class ClassB
{
public ClassA A { get; private set; }

public ClassB(ClassA a)
{
A = a;
}

public override string ToString()
{
return string.Format("I contain {0}", A);
}
}

private void TestContainer()
{
var container = new LightInject.ServiceContainer();
var a1 = new ClassA("A instance 1");
container.Register(x => a1);
container.Register<ClassB>();

var a2 = new ClassA("A instance 2");
var bwitha1 = container.GetInstance<ClassB>();
if(bwitha1.A != a1)
{
throw new InvalidOperationException("This will not happen");
}
var bwitha2 = container.GetInstance<ClassA, ClassB>(a2);
if(bwitha2.A != a2)
{
throw new InvalidOperationException("Something went wrong here");
}
}

如果我在 GetInstance 调用中给出显式实例,为什么 LightInject 之前注册的实例优先?如何解决这个问题并使用其中一个参数的替代实例构造对象?

最佳答案

在当前版本的 LightInject 中,如果你想使用运行时参数,你需要提供一个工厂。

以下解决方法可能适合您。

using LightInject;

class Program
{
static void Main(string[] args)
{
var container = new ServiceContainer();
container.Register<Bar>();
container.Register<Foo>();
container.Register<Bar, Foo>((factory, bar) => new Foo(bar), "FooWithRuntimeArgument");
var instance = container.GetInstance<Foo>();
var instanceWithRuntimeArgument = container.GetInstance<Bar, Foo>(new Bar(), "FooWithRuntimeArgument");
}
}

public class Foo
{
public Foo(Bar bar) {}
}

public class Bar {}

关于c# - 如何使用传递给构造函数的新实例覆盖已在 LightInject 中注册的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26300621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com