StructureMap 转发命名实例

StructureMap forwarding named instances

我正在使用 StructureMap 4.4.1。在我的代码中,我有 1 个具体的 class、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 抱怨命名实例不存在。

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

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

当您向 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");