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

时间:2017-12-20 12:04:35

标签: c# .net dependency-injection unity-container

创建单例时是否可以自动调用初始化方法? 我认为Unity可能有某种方式来做这件事。

现在我正在做这样的事情:

Container.RegisterType<IMyService, MyService >(new ContainerControlledLifetimeManager());
Container.Resolve<IMyService>().Initialize();

服务的位置如下:

class MyService : IMyService 
{
    public void Initialize() 
    {
    }
}

哪个不理想。 我希望我可以避免调用只创建对象的Container.Resolve<IMyService>(),以便我可以在其上调用Initialize()。由于这是在应用创建时调用的,因此会影响应用开始时间。

1 个答案:

答案 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'被调用(即这有点像对象有一个假定的'生命周期')