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

时间:2014-08-11 12:20:21

标签: c# asp.net-mvc dependency-injection castle-windsor

我有一个类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());

但是,我一直在玩DependsOnDynamicParameters,但我无法让它发挥作用。因此,非常感谢一个具体的例子!

1 个答案:

答案 0 :(得分:1)

我使用Typed Factory FacilityCmsService工厂传递到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 ,以便工厂匹配参数。