在实例注册时将值传递给构造函数

本文关键字:构造函数 值传 实例 注册 | 更新日期: 2023-09-27 18:17:39

我有一个类CmsService处理CMS相关的东西。为简单起见,假设它只有一个构造函数:

public CmsService(Site site)
{ .. }

Site是一个枚举(站点X、Y或Z),服务使用它来确定必须为哪个站点添加和检索页面、重建站点树等等。

显然,当在Site X中使用此服务时,我想使用Site来解决它。SiteX作为构造函数参数:

public PagesController(CmsService cmsService /* how can I pass SiteX here? */)
{ .. }

这是我的城堡DI注册:

container.Register(Component.For<CmsService>().LifestylePerWebRequest());

我想象这样的事情是可能的:

container.Register(Component.For<CmsService>().ForParameter("site", Site.SiteX).LifestylePerWebRequest());

然而,我一直在玩DependsOnDynamicParameters,但我不能让它工作。所以一个具体的例子将是非常感激的!

在实例注册时将值传递给构造函数

我将使用类型化工厂设施将CmsService工厂传递给PagesController构造函数,并在那里创建CmsService

定义工厂接口(无需实现):

public interface ICmsServiceFactory
{
    CmsService Create(Site site);
}

包括设施:

kernel.AddFacility<TypedFactoryFacility>();
kernel.Register(
                Component.For<ICmsServiceFactory>()
                         .AsFactory()
               );

更改PagesController构造函数:

public PagesController(ICmsServiceFactory cmsServiceFactory)
{
    this.cmsService = cmsServiceFactory.Create(Site.Sitex);
}

注意CmsService构造函数的Site形参必须命名为site,以便工厂匹配参数。