StructureMap转发命名实例

时间:2016-11-09 18:48:12

标签: structuremap structuremap4

我正在使用StructureMap 4.4.1。在我的代码中,我有一个具体的类TransactionalDatabaseClient,它实现了ITransactionalDatabaseClient,它继承自IDatabaseClient。我正在使用Forward方法重定向ITransactionalDatabaseClient的请求,以使用基本接口IDatabaseClient的注册来解析。

以下是我Registry的相关部分:

For<IDatabaseClient>().Add(context => new TransactionalDatabaseClient(context.GetInstance<IConnectionManager>(), "sqlserver")).Named("sqlserver");
For<IDatabaseClient>().Add(context => new TransactionalDatabaseClient(context.GetInstance<IConnectionManager>(), "oracle")).Named("oracle");

Forward<IDatabaseClient, ITransactionalDatabaseClient>();

问题在于,当我请求ITransactionalDatabaseClient的命名实例时,StructureMap会抱怨命名实例不存在。

我做错了什么?有解决方法吗?

1 个答案:

答案 0 :(得分:1)

不幸的是,转发和命名实例不能一起工作。

当您向StructureMap询问命名实例时,它会查找专门为该接口注册的实例,并且不会检查转发。对我有用的解决方案就是放弃转发并注册具体两次,每个界面一次。

对于您的问题,如下所示:

For<IDatabaseClient>().Add(context => new TransactionalDatabaseClient(context.GetInstance<IConnectionManager>(), "sqlserver")).Named("sqlserver");
For<IDatabaseClient>().Add(context => new TransactionalDatabaseClient(context.GetInstance<IConnectionManager>(), "oracle")).Named("oracle");

For<ITransactionalDatabaseClient>().Add(context => new TransactionalDatabaseClient(context.GetInstance<IConnectionManager>(), "sqlserver")).Named("sqlserver");
For<ITransactionalDatabaseClient>().Add(context => new TransactionalDatabaseClient(context.GetInstance<IConnectionManager>(), "oracle")).Named("oracle");