从here我理解如何指定一个组件,但是如果该组件实现了一个在容器中解析的接口呢?
我使用三个界面:IDBViewerModel
,IMembershipModel
和IMongoConnection
。我希望IDBViewerModel
至DBViewerModel
和IMembershipModel
至MembershipModel
。很容易。
但是,DBViewerModel
和MembershipModel
都期望IMongoConnection
作为构造函数注入的组件 - 并且这两个组件不相同所以我想使用服务覆盖。
我的例子如下。 DBViewerModel : IDBViewerModel
和MembershipModel : IMembershipModel,
其中DBViewerModel
和MembershipModel
构造函数期望注入的组件看起来像:
DBViewerModel(IMongoConnection uaxDB)
MembershipModel(IMongoConnection dataDB)
现在我有MongoConnection : IMongoConnection
和MongoConnection
看起来像:
public MongoConnection(string DBlocation, string DB)
我希望以不同方式提供DBlocation和DB参数,以便将MongoConnection
组件注入DBViewerModel
和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。已经有了 具有该名称的组件。你想修改现有的吗? 组件而不是?如果没有,请确保指定唯一名称。
答案 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
);