我有一个类CmsService
来处理CMS相关的东西。为简单起见,假设它有这个构造函数:
public CmsService(Site site)
{ .. }
Site
是一个枚举(站点X,Y或Z),服务使用它来确定哪个站点必须添加和检索页面,重建sitetree等等。
显然,在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
,但我无法让它发挥作用。因此,非常感谢一个具体的例子!
答案 0 :(得分:1)
我使用Typed Factory Facility将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 ,以便工厂匹配参数。