1

使用StructureMap,我们拥有所有类型的自动注册。如何指定命名实例作为StructureMap自动注册类型的构造函数参数

public class MessageRegistry : Registry 
{ 
    public MessageRegistry(){ 
     Scan(x => 
      { 
       x.AssemblyContainingType(typeof (FormatHelper)); 
       x.ConnectImplementationsToTypesClosing(typeof (IMessage<>)); 
      }); 
    } 
} 

所以,如果我们寻找IMessage<Currency>时,会发现以下类型:

CurrencyMessageHandler : IMessage<Currency> 
{ 
    public CurrencyMessageHandler(ISession instance) 
} 

至于构造函数参数类型的Isession,我们希望它是自动有线,但是,我们有像SqlSession和OracleSession这样的超过1个实现。在这种情况下,我们想通过SqlSession作为构造函数参数。

如何在这种情况下指定命名实例作为构造函数参数?

非常感谢。

+0

根据我的经验,这是最好的避免这种构造,因为这会使代码和DI配置变得复杂。你能否多解释一下'CustomeType'的用途,它的使用方式,来自哪里以及它在应用程序的生命周期中如何改变? – Steven

+0

感谢您的回复。我知道这不是一个好设计。我实际上可以重构代码以避免它。但是,我只是想知道是否有可能在不重构的情况下实现目标? (更新上面的问题:)) – Pii

+0

那么你什么时候使用'SqlSession'和'OracleSession'呢?你的应用程序是否同时连接到两个数据库?他们都有自己的数据模型还是代表相同的模型? – Steven

回答

0

我有同样的确切的问题,我通过从扫描排除类型,然后自定义配置它解决了这个问题:

Scan(scan => scan.Exclude(t => t == typeof(CurrencyMessageHandler)); 

然后:

For<IMessage<Currency>>.Add<CurrencyMessageHandler>() 
    .Ctor<ISession>.Is(a => a.TheInstanceNamed("SqlServer")); 
相关问题