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

问题描述 投票:0回答:2

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

我们来看一个例子:

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

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

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

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

MainSingletonObject.Initialize();

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

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

c# architecture ioc-container
2个回答
1
投票

我会在服务引导阶段使用IoC:

ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
                { 
                    new ServiceClass() 
                };
            ServiceBase.Run(ServicesToRun);

我没有使用new ServiceClass,而是通过IoC解析服务类。因此,您应避免在服务实现中具有IoC依赖性。如果您需要通过注入构建一个来自实现内部的全新对象,请考虑公开在IoC中注册的服务ITypeFactory,它将您的代码与您将使用的特定容器隔离开来。一般情况下,如果您对容器进行隔热,则可以在IoC中测量好的设计。


0
投票

单身人士不得依赖他人来初始化它。它一旦使用就会初始化。

我就是这样做的:

public class MySingleton
{
    private static readonly MySingleton _instance = new MySingleton();

    private MySingleton()
    {
        // ... read config
    }

    public static MySingleton Instance
    {
        get { return _instance; }
    }
}

在这里static readonly确保这是懒惰负载。

© www.soinside.com 2019 - 2024. All rights reserved.