2016-05-09 46 views
0

在面试过程中,我被问到了这一点。如何配置依赖注入以仅允许一个类的一个实例?

我们在我们的项目统一容器中使用依赖注入。它得到使用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>(); 
     } 

    } 

有两个问题在Globals.asax初始化。

  1. DI通过项目初始化多少次?
  2. 如何配置依赖注入以仅允许一个类的实例?

这是一个非常基本的问题,我很糟糕地把它们弄糊涂了。你能为他们提出一些答案吗? 项目环境为VS2015,C#,MVC 5,Unity,Repository模式,EF。

回答

2

DI conatainer将上一次申请时被初始化(Application_Start()事件Global.asax)。

2.他们询问ContainerControlledLifetimeManager 有这需要参数LifetimeManager类型的实例RegisterType方法的重载,使实例被创建一次,该实例将被用于每一次,它不会产生新现在反对的依赖解析每次:

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

从MSDN:

ContainerControlledLifet imeManager将现有对象注册为单例实例。对于此生存期管理器,每次调用Resolve或ResolveAll方法时或者依赖关系机制将实例注入其他类时,Unity会返回相同的注册类型或对象实例。这个终身管理器有效地实现了对象的单例行为。

您可以在this MSDN link

+0

谢谢,@ehsan的答案阅读更多关于生活时间管理。如果该对象只是使用containercontrolledlifetimemanager创建一次,那么如果其他一些动作尝试访问它,请问这会创建任何类型的线程锁定 – ankur

+0

它应用单例对实例,所以我应该想,但我不确定,可以阅读该链接了解更多详情,希望你能在这里得到你的回答:) –

-1

假设我们已经通过人的对象,然后用DI传递PersonWrapper对象,然后使用方法GetPerson()来获取单thePerson

public class PersonWrapper 
{ 
    private static Person thePerson = null; 

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