1

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

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

4

1 回答 1

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");
于 2017-10-23T14:11:14.607 回答