我正在使用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会抱怨命名实例不存在。
我做错了什么?有解决方法吗?
答案 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");