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

问题描述 投票:1回答:1

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

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

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

服务的位置如下:

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

哪个不理想。我希望我可以避免调用只创建对象的Container.Resolve<IMyService>(),这样我就可以调用它上面的Initialize()。由于这是在创建应用程序时调用的,因此会损害应用程序的启动时间。

c# .net dependency-injection unity-container
1个回答
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方法:

container.RegisterType<IMyService>(new InjectionFactory(c =>
{
    var transient = c.Resolve<MyService>();
    transient.Initialize();
    return transient;
}));

然而,根据@Sandy的评论,类MyService的设计似乎有些不妥,因为在创建了对象(已经调用了它的构造函数)之后,该对象仍处于可以使用的状态,直到'Initialize '已被调用(即这有点像对象有一个假定的'生命周期')

© www.soinside.com 2019 - 2024. All rights reserved.