为什么这个实例不是由统一而不是单身人士启动?
-
20-09-2019 - |
题
在我的ASP.NET-MVC应用程序中,我有一个称为静态createContainer()方法的statis mvcapplication。
在这种方法中,我创建我的Unity IOC容器:
private static IUnityContainer CreateContainer()
{
var container = new UnityContainer();
container.RegisterType<IConfigurationService, ConfigFile>();
container.RegisterType<ILoggerService, NlogLoggerService>();
container.RegisterInstance<ISearchService>(
new LuceneSearchService(
container.Resolve<IConfigurationService>(),
container.Resolve<ILoggerService>()),
new ContainerControlledLifetimeManager());
}
如果我很好地了解了我的消息来源,这应该给我一个Singleton LuceneSearchService实例。但是,在我的记录中,我可以看到每次请求此实例时都会击中我的构造函数。
我究竟做错了什么?
解决方案
对于单身人士,您应该在功能外移动容器的定义,并使其静态。默认情况下将其设置为空。
然后在您的CreateContainer函数中,检查容器是否为空。如果是这样,请创建并初始化它。否则,只需返回即可。
private static IUnityContainer container = null;
private static IUnityContainer CreateContainer()
{
if( container == null )
{
container = new UnityContainer();
container.RegisterType<IConfigurationService, ConfigFile>();
container.RegisterType<ILoggerService, NlogLoggerService>();
container.RegisterInstance<ISearchService>(
new LuceneSearchService(
container.Resolve<IConfigurationService>(),
container.Resolve<ILoggerService>()),
new ContainerControlledLifetimeManager());
}
return container;
}
其他提示
我认为这会起作用,假设您正在解决 ISearchService
而不是一个 LuceneSearchService
直接 - 在这种情况下,我认为Unity每次都会创建一个新实例,因为将没有现有的映射。
就个人而言,我也将其注册为:container.RegisterType<ISearchService, LuceneSearchService>(new ContainerControlledLifetimeManager());
不隶属于 StackOverflow