如何配置依赖注入以仅允许一个类的一个实例?

时间:2016-05-09 09:26:10

标签: c# asp.net-mvc-4 dependency-injection unity-container

在采访中我被问到这个问题。

我们在项目统一容器中使用依赖注入。哪个使用Globals.asax

Bootstrapper.Initialise();中初始化

我的DI

public class Bootstrapper
    {
        public static IUnityContainer Initialise()
        {
            var container = BuildUnityContainer();
            DependencyResolver.SetResolver(new UnityDependencyResolver(container));
            return container;
        }
        private static IUnityContainer BuildUnityContainer()
        {
            IUnityContainer container = new UnityContainer();
            RegisterService(container);
            return container;
        }
        public static void RegisterService(IUnityContainer container)
        {
            container.RegisterType<ILibraryService, LibraryService>();
        }

    }

有两个问题。

  1. 在整个项目中初始化DI的次数是多少次?
  2. 如何配置依赖注入以仅允许一个类的实例?
  3. 这是非常基本的问题,我正在严厉地对待他们。你能为他们提出一些答案吗? 项目环境是VS2015,C#,MVC 5,Unity,Repository模式,EF。

2 个答案:

答案 0 :(得分:2)

1。 DI conatainer将在应用程序启动时初始化一次( Global.asax 中的Application_Start()事件。)

2。他们在询问ContainerControlledLifetimeManagerRegisterType方法的重载,它接受参数类型为LifetimeManager的实例,因此该实例创建一次并且每次都会使用该实例,每次都不会创建新对象以进行依赖项解析现在:

container.RegisterType<ILibraryService, LibraryService>(new ContainerControlledLifetimeManager());

来自MSDN:

  

ContainerControlledLifetimeManager ,它将现有对象注册为单例实例。对于此生命周期管理器,每次调用Resolve或ResolveAll方法时,或者当依赖性机制将实例注入其他类时,Unity都会返回已注册类型或对象的相同实例。这个生命周期管理器有效地实现了对象的单例行为。

您可以在this MSDN link

了解有关终身经理的更多信息

答案 1 :(得分:-1)

让我们说我们传递person对象然后使用DI传递PersonWrapper对象然后使用方法GetPerson()来获取singleton thePerson

public class PersonWrapper
{
    private static Person thePerson = null;

    public static GetPerson
    {
       get
       {
           if(thePerson==null) { thePerson = new Person();}
           return thePerson;
       }
    }
}