组件基于接口生成时的服务覆盖已存在具有该名称的组件

时间:2012-11-09 17:16:40

标签: c# castle-windsor

here我理解如何指定一个组件,但是如果该组件实现了一个在容器中解析的接口呢?

我使用三个界面:IDBViewerModelIMembershipModelIMongoConnection。我希望IDBViewerModelDBViewerModelIMembershipModelMembershipModel。很容易。

但是,DBViewerModelMembershipModel都期望IMongoConnection作为构造函数注入的组件 - 并且这两个组件不相同所以我想使用服务覆盖。

我的例子如下。 DBViewerModel : IDBViewerModelMembershipModel : IMembershipModel,其中DBViewerModelMembershipModel构造函数期望注入的组件看起来像:

DBViewerModel(IMongoConnection uaxDB)
MembershipModel(IMongoConnection dataDB)

现在我有MongoConnection : IMongoConnectionMongoConnection看起来像:

public MongoConnection(string DBlocation, string DB)

我希望以不同方式提供DBlocation和DB参数,以便将MongoConnection组件注入DBViewerModelMembershipModel。所以我试试:

 container.Register(Component
               .For<IDBViewerModel>()
               .ImplementedBy<DBViewerModel>()
               .LifeStyle.PerWebRequest);

         container.Register(Component
               .For<IMembershipModel>()
               .ImplementedBy<MembershipModel>()
               .LifeStyle.PerWebRequest);


container.Register(
           Component.For<IMongoConnection>()
               .ImplementedBy<MongoConnection>()
               .Named("myservice.dataDB")
               .DependsOn(Property.ForKey("DBlocation").Eq(USERmongoURL),
                    Property.ForKey("DB").Eq(USERmongoCollection))
               .LifeStyle.PerWebRequest,
           Component.For<IMongoConnection>()
               .ImplementedBy<MongoConnection>()
               .Named("myservice.uaxDB")
               .DependsOn(Property.ForKey("DBlocation").Eq(UAXmongoURL),
                    Property.ForKey("DB").Eq(UAXmongoCollection))
               .LifeStyle.PerWebRequest,

           Component.For<DBViewerModel>()
               .ServiceOverrides(ServiceOverride.ForKey("dataDB").Eq("myservice.dataDB")),
           Component.For<MembershipModel>()
               .ServiceOverrides(ServiceOverride.ForKey("uaxDB").Eq("myservice.uaxDB"))

       );

我的错误消息说明了一切 - 但我不知道如何正确解决我的依赖关系链:

  

无法注册组件DBViewerModel。已经有了   具有该名称的组件。你想修改现有的吗?   组件而不是?如果没有,请确保指定唯一名称。

1 个答案:

答案 0 :(得分:0)

这应该有效:

container.Register(Component
         .For<IDBViewerModel>()
         .ImplementedBy<DBViewerModel>()
         .LifeStyle.PerWebRequest
         .DependsOn(Dependency.OnComponent("dataDB", "myservice.dataDB")));

container.Register(Component
         .For<IMembershipModel>()
         .ImplementedBy<MembershipModel>()
         .LifeStyle.PerWebRequest
         .DependsOn(Dependency.OnComponent("uaxDB", "myservice.uaxDB")));


container.Register(
       Component.For<IMongoConnection>()
           .ImplementedBy<MongoConnection>()
           .Named("myservice.dataDB")
           .DependsOn(Property.ForKey("DBlocation").Eq(USERmongoURL),
                Property.ForKey("DB").Eq(USERmongoCollection))
           .LifeStyle.PerWebRequest,
       Component.For<IMongoConnection>()
           .ImplementedBy<MongoConnection>()
           .Named("myservice.uaxDB")
           .DependsOn(Property.ForKey("DBlocation").Eq(UAXmongoURL),
                Property.ForKey("DB").Eq(UAXmongoCollection))
           .LifeStyle.PerWebRequest

   );