![](/img/trans.png)
[英]System.StackOverflowException when trying to call Singleton method
[英]Is it possible to call an initialization method when singleton is created?
创建单例时是否可以自动调用初始化方法? 我认为Unity可能有某种方式可以做到这一点。
现在我正在做这样的事情:
Container.RegisterType<IMyService, MyService >(new ContainerControlledLifetimeManager());
Container.Resolve<IMyService>().Initialize();
服务如下所示:
class MyService : IMyService
{
public void Initialize()
{
}
}
这不理想。 我希望可以避免调用Container.Resolve<IMyService>()
,后者仅创建对象,因此可以在其上调用Initialize()
。 而且由于在应用程序创建时调用了它,因此会损害应用程序的启动时间。
尽管并不是真正依赖于依赖注入,但也可以手动创建依赖对象,对其运行任何创建后初始化步骤,然后使用RegisterInstance在容器中注册 “可用”对象。
因为您说MyService
是单例,所以您只能注册一个实例:
var myService = new MyService(<ctor parameters go here>);
myService.Initialize();
Container.RegisterInstance<IMyService>(myService);
如果MyService
本身具有要解决的复杂的构造函数依赖关系,则可以在引导过程中将Unity用作服务定位器,即
// NB : Resolve the concrete type, not the interface
var myService = Container.Resolve<MyService>();
// 'Fix' the instance.
myService.Initialize();
// Register via Interface
Container.RegisterInstance<IMyService>(myService);
在更一般的情况下(即无法共享一个MyService
实例),您需要注册一个工厂,以便可以在每个新实例上调用Initialize
方法:
container.RegisterType<IMyService>(new InjectionFactory(c =>
{
var transient = c.Resolve<MyService>();
transient.Initialize();
return transient;
}));
但是,按照@Sandy的评论,类MyService
的设计似乎不对劲,因为在创建对象(调用了构造函数)之后,该对象仍处于无法使用的状态,直到'Initialize已被调用(即闻起来有点像对象具有假定的“生命周期”)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.