我的问题是关于软件架构。
让我们考虑一个例子:
我们有一个Windows服务应用程序。
Program.cs创建并启动MainService
类的实例。
MainService
继承自ServiceBase
因此实施OnStart(string[] args)
方法。
通常,当我设计我的应用程序时,我会在OnStart
方法中执行类似的操作:
MainSingletonObject.Initialize();
Initialize将从app.config读取配置数据并创建所需类的实例,打开WCF主机(如果有)等。
这是启动服务应用程序的好习惯吗?改善设计的个人建筑建议是什么?在哪里适合IoC容器,如果我手动执行依赖注入,为什么我需要它。
答案 0 :(得分:1)
我会在服务引导阶段使用IoC:
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new ServiceClass()
};
ServiceBase.Run(ServicesToRun);
我将通过IoC解析服务类,而不是new ServiceClass
。因此,您应避免在服务实现中具有IoC依赖性。如果您需要通过注入构建一个来自实现内部的全新对象,请考虑公开在IoC中注册的服务ITypeFactory
,使您的代码与您将使用的特定容器隔离。一般情况下,如果您对容器进行隔热,也可以在IoC中测量好的设计。
答案 1 :(得分:0)
Singleton不得依赖其他人来初始化它。它会在使用后立即初始化。
我就是这样做的:
public class MySingleton
{
private static readonly MySingleton _instance = new MySingleton();
private MySingleton()
{
// ... read config
}
public static MySingleton Instance
{
get { return _instance; }
}
}
此处static readonly
确保此延迟加载。