在采访中我被问到这个问题。
我们在项目统一容器中使用依赖注入。哪个使用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>();
}
}
有两个问题。
这是非常基本的问题,我正在严厉地对待他们。你能为他们提出一些答案吗? 项目环境是VS2015,C#,MVC 5,Unity,Repository模式,EF。
答案 0 :(得分:2)
1。 DI conatainer将在应用程序启动时初始化一次( Global.asax 中的Application_Start()
事件。)
2。他们在询问ContainerControlledLifetimeManager
有RegisterType
方法的重载,它接受参数类型为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;
}
}
}