创建单例时是否可以自动调用初始化方法? 我认为Unity可能有某种方式来做这件事。
现在我正在做这样的事情:
Container.RegisterType<IMyService, MyService >(new ContainerControlledLifetimeManager());
Container.Resolve<IMyService>().Initialize();
服务的位置如下:
class MyService : IMyService
{
public void Initialize()
{
}
}
哪个不理想。
我希望我可以避免调用只创建对象的Container.Resolve<IMyService>()
,以便我可以在其上调用Initialize()
。由于这是在应用创建时调用的,因此会影响应用开始时间。
答案 0 :(得分:3)
虽然不是真正遵循依赖注入的精神,但也可以手动创建依赖项对象,在其上运行任何创建后初始化步骤,然后使用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
方法: / p>
container.RegisterType<IMyService>(new InjectionFactory(c =>
{
var transient = c.Resolve<MyService>();
transient.Initialize();
return transient;
}));
然而,根据@Sandy的评论,类MyService
的设计似乎有些问题,因为在创建对象(已经调用了它的构造函数)之后,该对象仍处于不存在的状态它可以被使用,直到'Initialize'被调用(即这有点像对象有一个假定的'生命周期')