在架构上用IoC Container替换singleton主对象

时间:2011-04-19 15:58:21

标签: c# architecture ioc-container

我的问题是关于软件架构。

让我们考虑一个例子:

我们有一个Windows服务应用程序。

Program.cs创建并启动MainService类的实例。

MainService继承自ServiceBase因此实施OnStart(string[] args)方法。

通常,当我设计我的应用程序时,我会在OnStart方法中执行类似的操作:

MainSingletonObject.Initialize();

Initialize将从app.config读取配置数据并创建所需类的实例,打开WCF主机(如果有)等。

这是启动服务应用程序的好习惯吗?改善设计的个人建筑建议是什么?在哪里适合IoC容器,如果我手动执行依赖注入,为什么我需要它。

2 个答案:

答案 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确保此延迟加载