0

ここから、コンポーネントを指定する方法を理解しましたが、コンポーネント自体がコンテナーで解決されるインターフェイスを実装している場合はどうなりますか?

私は3つのインターフェースを使用します:IDBViewerModel、、。とに決心したい。簡単です。IMembershipModelIMongoConnectionIDBViewerModelDBViewerModelIMembershipModelMembershipModel

ただし、とは両方ともDBViewerModel、コンストラクターによって注入されたコンポーネントとしてMembershipModel期待IMongoConnectionされます。2つのコンポーネントは同じではないため、サービスオーバーライドを使用します。

私の例は次のとおりです。DBViewerModel : IDBViewerModelそしてMembershipModel : IMembershipModel,、コンストラクターは注入されたコンポーネントを期待しDBViewerModelMembershipModel次のようになります。

DBViewerModel(IMongoConnection uaxDB)
MembershipModel(IMongoConnection dataDB)

今私は持っていてMongoConnection : IMongoConnection、次のようにMongoConnection見えます:

public MongoConnection(string DBlocation, string DB)

MongoConnectionコンポーネントをDBViewerModelとに挿入するために、DBlocationとDBパラメーターを別々に提供したいと思いますMembershipModel。だから私は試してみます:

 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 に答える