2010-11-03 25 views
0

对,所以我对Castle很陌生,我试图弄清楚需要多远才能连接服务。下面是我正在使用的课程以及他们在我创建的世界中的位置的示例。为了正确连接Castle Windsor的DI课程,我需要在课程中多深入?

alt text

我试图完成它,正确连接了城堡,这样我可以调用TemplateEmailViaSalesforce类做的工作,并且必须通过DI从城堡连线了相关的类。但我不确定在注册组件时我需要走多远。下面是我的第一次尝试(我通过代码注册为审判,这是一对夫妇方法混搭创建容器)

IWindsorContainer container = new WindsorContainer(); 
     container.AddFacility<FactorySupportFacility>(); 

     // add the DAL mapper factory 
     container.AddComponent<ITemplateMapperFactory>(); 

     // individual mappers 
     container.Register(Component.For<ICSGEmailTemplateMapper>().UsingFactory((ITemplateMapperFactory f) => f.CSGEMailTemplate)); 
     container.Register(Component.For<IUserMapper>().UsingFactory((ITemplateMapperFactory f) => f.User)); 
     container.Register(Component.For<IGoupMapper>().UsingFactory((ITemplateMapperFactory f) => f.Group)); 
     container.Register(Component.For<IAccountTeamMapper>().UsingFactory((ITemplateMapperFactory f) => f.AccountTeam)); 
     container.Register(Component.For<ISalesTeamMapper>().UsingFactory((ITemplateMapperFactory f) => f.SalesTeam)); 
     container.Register(Component.For<ICSGFormulaMapper>().UsingFactory((ITemplateMapperFactory f) => f.CSGFormula)); 
     container.Register(Component.For<ISFObjectDefinitionMapper>().UsingFactory((ITemplateMapperFactory f) => f.SFDCObjectDefinition)); 
     container.Register(Component.For<ISFObjectValueMapper>().UsingFactory((ITemplateMapperFactory f) => f.SFDCObjectValue)); 
     container.Register(Component.For<ISalesforceTemplateMapper>().UsingFactory((ITemplateMapperFactory f) => f.Template)); 
     container.Register(Component.For<IRecipientMapper>().UsingFactory((ITemplateMapperFactory f) => f.Recipient)); 

     // BLL stuff (domain components)...general 
     container.AddComponent<CSGEmailTemplateRepository, CSGEmailTemplateRepository>(); 
     container.AddComponent<RecipientRepository, RecipientRepository>(); 
     container.AddComponent<SFObjectDefinitionRepository, SFObjectDefinitionRepository>(); 
     container.AddComponent<SFObjectValueRepository, SFObjectValueRepository>(); 
     container.AddComponent<TemplateRepository, TemplateRepository>(); 
     container.AddComponent<UserRepository, UserRepository>(); 
     container.AddComponent<ITemplateService, TemplateService>(); 

     // specific for this action 
     container.AddComponent<TemplateEmailerViaSalesforce>(); 
     container.AddComponent<TemplateParse>(); 

     // Aspects 
     container.AddComponent<TraceAspect>(); 

现在,我在后来得到一个错误:container.Resolve<TemplateEmailerViaSalesforce>();

AssemblerTests.ShouldCreateTemplateService : FailedTest method Tests.AssemblerTests.ShouldCreateTemplateService threw exception: Castle.MicroKernel.Facilities.FacilityException: You have specified a factory ('Castle.MicroKernel.Registration.GenericFactory`1[[CSG.Salesforce.TemplateEmailer.DAL.Access.IUserMapper, CSG.Salesforce.TemplateEmailer.DAL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' - method to be called: Create) for the component 'CSG.Salesforce.TemplateEmailer.DAL.Access.IUserMapper' CSG.Salesforce.TemplateEmailer.DAL.Access.IUserMapper that failed during invoke. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> Castle.MicroKernel.ComponentRegistrationException: Type CSG.Salesforce.TemplateEmailer.DAL.ITemplateMapperFactory is abstract. 

的失败似乎是IUserMapper定义为class UserMapper:BaseSalesforceMapper<UserData>,IUserMapper

的其他地图制作工作,但我得到一个错误,并不是所有的依存关系感到满意,这是我需要的IUserMapper注册完全满足。

为了获得这种有线连接,我必须走多远的兔子洞?在这一点上,我正在寻找BLL进入DAL和进入应用程序映射器的基础类,而这看起来并不正确。我正在努力弄清楚我必须注册什么,以及Castle本身对DI所隐含的做法。

任何帮助都将不胜感激。谢谢。 enter code here

+0

请格式化异常消息。 – 2010-11-03 15:41:05

回答

3

这是我在你的代码中看到的问题:

  • container.AddComponent<ITemplateMapperFactory>();

    你需要在这里提供的实现类,这是解决的时候你得到的是异常的原因。

  • container.AddComponent<UserRepository, UserRepository>();

    如果你没有注册的接口的组件没有必要重复实现型的服务类型。

  • UsingFactory()已过时。改为使用UsingFactoryMethod()

  • AddComponent()已过时。改为使用Register(Component.For...))
  • 在最新版本的Windsor中,无需添加FactorySupportFacility即可使用UsingFactoryMethod()

我必须注册什么,以及由DI本身隐含做什么。

您需要注册每个组件,您需要Windsor进行管理。如果你不注册,温莎不知道。但你可以set up conventions to avoid registering components individually。温莎为你做的是隐式地自动布线组件。

+0

干杯,谢谢你的所有。标记为回答,因为这是很好的方向。 – BryanGrimes 2010-11-03 16:06:01

0

我不完全理解你在这里所做的一切。最好简单地开始,只需几个班级,然后采取宝贝步骤,按所需方式配置一切。您还可能想要查看Windsor的自动布线 - 它应该至少可以让您的某些组件更易于配置。所有这一切说,它看起来像我指定一个接口用于工厂实现(ITemplateMapperFactory)。如错误消息所示:“ITemplateMapperFactory是抽象的”。温莎不能实例化一些无法实例化的东西。

声明:我不是工厂的专家,因为我不使用它。

+0

在这一点上,我非常喜欢创建一个更小的发送解决方案,并从那里开始工作。谢谢 – BryanGrimes 2010-11-03 14:44:14