gpt4 book ai didi

c# - 具有依赖注入(inject)的单例

转载 作者:行者123 更新时间:2023-11-30 16:40:54 26 4
gpt4 key购买 nike

我决定使用单例,以便在应用程序启动时加载一些文件,并在整个应用程序生命周期中使用此配置,因为此文件每年更改一次。有一个单例:

 public class Singleton
{
private static IReader reader;

private Singleton(IReader reader)
{
Singleton.reader = reader;
}

private static readonly Lazy<Dictionary<string, HashSet<string>>> lazy =
new Lazy<Dictionary<string, HashSet<string>>>(() => reader.ReadData("config") );


public static Dictionary<string, HashSet<string>> Instance { get { return lazy.Value; } }
}

在 Appstart 上我有:

 IWindsorContainer container = new WindsorContainer();
container.Install(FromAssembly.This());

在 WindsorInstaller 上我有:

public class WindsorInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<IReader>().ImplementedBy<MyReader>());
}
}

我的读者类如下:

 public class MyReader : IReader
{
public Dictionary<string, HashSet<string>> ReadData(string source)
{
/*some code*/
return dict;
}
}

似乎没有在 Singleton 上发生注入(inject),reader 为 null,我得到错误:未将对象引用设置为对象的实例。您能否建议我做错了什么以及如何做得更好(可能根本不使用单例)?

最佳答案

如果打算将其与容器一起使用但仍使用静态,那么您对带有依赖注入(inject)的单例的概念有点偏差。

此外,您的类还有一个private 构造函数。容器应该如何将依赖项显式注入(inject)私有(private)构造函数?

构造预期单例的接口(interface)/抽象。

public interface ISingleton {
Dictionary<string, HashSet<string>> Instance { get; }
}

和实现...

public class Singleton: ISingleton {
private readonly Lazy<Dictionary<string, HashSet<string>>> lazy;

public Singleton(IReader reader) {
this.lazy = new Lazy<Dictionary<string, HashSet<string>>>(() => reader.ReadData("config") );
}

public Dictionary<string, HashSet<string>> Instance { get { return lazy.Value; } }
}

然后将其作为单例注册到容器中

public class WindsorInstaller : IWindsorInstaller {
public void Install(IWindsorContainer container, IConfigurationStore store) {
container.Register(Component.For<IReader>().ImplementedBy<MyReader>());
container.Register(Component.For<ISingleton>().ImplementedBy<Singleton>().LifestyleSingleton());
}
}

任何将 ISingeton 作为依赖项的类都将在请求时获得相同的实例注入(inject),并且 Singleton 实现将在解析时获得其依赖项。

关于c# - 具有依赖注入(inject)的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50224135/

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