gpt4 book ai didi

c# - 使用简单注入(inject)器,是否可以通过其实现类型获得单例?

转载 作者:行者123 更新时间:2023-11-30 22:53:20 24 4
gpt4 key购买 nike

如果我在容器中注册如下:

container.Register<IShell, ShellViewModel>(Lifestyle.Singleton);

有没有办法使用“实现类型”获得相同的实例ShellViewModel

例子:

container.GetInstance<ShellViewModel>();

上面一行返回一个不同于container.GetInstance<IShell>()的实例.如何确保两次调用的实例相同?

我用 ResolveUnregisteredType 解决了它事件。

private void ContainerResolveUnregisteredType(
object sender, UnregisteredTypeEventArgs e)
{
var producer = container.GetRootRegistrations()
.FirstOrDefault(r => r.Registration
.ImplementationType == e.UnregisteredServiceType);
if (producer != null && producer.Lifestyle == Lifestyle.Singleton)
{
var registration = producer.Lifestyle
.CreateRegistration(
e.UnregisteredServiceType,
producer.GetInstance,
container);
e.Register(registration);
}
}

这是正确的方法吗?

最佳答案

您只需将它们都注册为单例:

container.RegisterSingleton<ShellViewModel>();
container.RegisterSingleton<IShell, ShellViewModel>();

更新

确认使用简单的单元测试:

[TestMethod]
public void RegisterSingleton_TwoRegistrationsForTheSameImplementation_ReturnsTheSameInstance()
{
var container = new Container();

container.RegisterSingleton<ShellViewModel>();
container.RegisterSingleton<IShell, ShellViewModel>();

var shell1 = container.GetInstance<IShell>();
var shell2 = container.GetInstance<Shell>();

Assert.AreSame(shell1, shell2);
}

关于c# - 使用简单注入(inject)器,是否可以通过其实现类型获得单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57292138/

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