ここから、コンポーネントを指定する方法を理解しましたが、コンポーネント自体がコンテナーで解決されるインターフェイスを実装している場合はどうなりますか?
私は3つのインターフェースを使用します:IDBViewerModel
、、。とに決心したい。簡単です。IMembershipModel
IMongoConnection
IDBViewerModel
DBViewerModel
IMembershipModel
MembershipModel
ただし、とは両方ともDBViewerModel
、コンストラクターによって注入されたコンポーネントとしてMembershipModel
期待IMongoConnection
されます。2つのコンポーネントは同じではないため、サービスオーバーライドを使用します。
私の例は次のとおりです。DBViewerModel : IDBViewerModel
そしてMembershipModel : IMembershipModel,
、コンストラクターは注入されたコンポーネントを期待しDBViewerModel
、MembershipModel
次のようになります。
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を登録できませんでした。その名前のコンポーネントはすでに存在します。代わりに、既存のコンポーネントを変更しましたか?そうでない場合は、必ず一意の名前を指定してください。