繁体   English   中英

创建单例时是否可以调用初始化方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM