在实例注册时将值传递给构造函数
本文关键字:构造函数 值传 实例 注册 | 更新日期: 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());
然而,我一直在玩DependsOn
和DynamicParameters
,但我不能让它工作。所以一个具体的例子将是非常感激的!
我将使用类型化工厂设施将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,以便工厂匹配参数。