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