如何防止在其他地方实例化Dependency对象?

时间:2015-12-06 19:48:46

标签: c# mvvm dependency-injection

所以基本上如果我有一个实现接口MyMonkeyService的服务IMyMonkeyService并且我将一个DI对象注册为:

SimpleIOC.Default.Register(Of IMyMonkeyService, MyMonkeyService)

如何确保我之后的某些开发人员不打算在应用程序的某个位置创建MyMonkeyService的新实例?我无法使Service的构造函数成为私有或受保护,因为DI无法工作,如果我在服务上创建一个Init()方法,它仍然可供“新开发人员”使用。

2 个答案:

答案 0 :(得分:2)

如何让MyMonkeyService成为singleton

你会有这样的实现:

public class MyMonkeyService : IMyMonkeyService
{
    private static MyMonkeyService _instance;

    public static IMyMonkeyService Instance
    {
        get
        {
            // Gets the singleton if created, otherwise create a new instance
            return _instance != null ? _instance : (_instance = new MyMonkeyService());
        }
    }

    // Private constructor
    private MyMonkeyService()
    {
       // ...
    }
}

我不知道您正在使用哪种DI框架,但最终会得到以下内容:

SimpleIOC.Default.Register(Of IMyMonkeyService, MyMonkeyService.Instance);

每次注入您的服务时,都会使用相同的实例

答案 1 :(得分:1)

如果您需要多个实例,那么您无法理解。您为DI容器提供的所有内容都可供另一位开发人员使用。

您可以编写analyzer,它会检查MyMonkeyService的实例化并发出相应的错误。

Thisthis可以帮助您入门。

Roselyn Analyzers允许您编写代码分析工具,检查特定模式的代码,并相应地发出错误和警告。您甚至可以为该模式定义修复程序。