0

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

我使用三个接口IDBViewerModelIMembershipModelIMongoConnection。我希望解决IDBViewerModeltoDBViewerModelIMembershipModelto MembershipModel。很容易。

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

我的例子如下。whereDBViewerModel : IDBViewerModel和构造函数期望注入的组件看起来像:MembershipModel : IMembershipModel,DBViewerModelMembershipModel

DBViewerModel(IMongoConnection uaxDB)
MembershipModel(IMongoConnection dataDB)

现在我有MongoConnection : IMongoConnection并且MongoConnection看起来像:

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。已经有一个具有该名称的组件。您是否想修改现有组件?如果不是,请确保指定一个唯一名称。

4

1 回答 1

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

   );
于 2012-11-12T07:52:23.780 回答